Conferencia R-Estadística

Conferencias R-Estadística

En la primera edición de “Conferencias R-Estadística”, se contó con la participación de seis miembros de RUGE que nos brindaron diferentes charlas sobre la modelización espacio - temporal desde un enfoque Paramétrico y No Paramétrico.

Objetivo

Proporcionar un punto de encuentro periódico a profesionales, docentes e investigadores interesados en la teoría estadística y sus aplicaciones.

Fomentar la colaboración en temas multidisciplinarios y divulgar el conocimiento a través del uso de software libre R.

Agenda

Web del evento

PRESENTACIONES

INTRODUCCIÓN A LAS SERIES DEL TIEMPO

Las series de tiempo nos rodean, desde los registros en un servidor hasta los datos financieros de alta frecuencia. Se describirá las definiciones básicas y usos de las series de tiempo, para luego describir las técnicas básicas necesarias para extraer información significativa de los datos de series de tiempo. Se describirán los paquetes y funciones equivalentes utilizados en R.

POR: YANDIRA CUVERO

INTRODUCCIÓN A LAS SERIES DEL TIEMPO

INTRODUCCIÓN A LOS MODELOS DINÁMICOS

En esta intervención se dará una introducción a los modelos dinámicos, explicados por su mismo pasado y/o variables exógenas. Se comenzará con los modelos univariados autor-regresivos para luego continuar con los multivariados. En la parte multivariada se considerará el problema de endogeneidad, identificación estructural, el problema de variable omitida, parámetros estructurales y modelos con volatilidad estocástica

POR: PAUL CARRILLO MALDONADO

This browser does not support PDFs. Please download the PDF to view it: Download PDF.</p> </embed>

MODELAMIENTO EN LA INDUSTRIA 4.0 Y EL BIG DATA

Presentación de nuevas metodologías, técnicas y paquetes en R que aportan posibles soluciones a problemas reales en la industria y en los laboratorios de análisis. Así, la combinación de técnicas de detección de atípicos con datos funcionales y el uso de gráficos de control de rangos, r, tienen la necesidad de resolución de problemas de detección de anomalías relacionadas con el consumo eléctrico, confort térmico y calidad del aire en edificios comerciales y públicos.

POR: MIGUEL FLORES

GEOESTADÍSTICA NO PARAMÉTRICA

En esta charla tiene como objetivo brindar una introducción a la modelización geoestadística basada en técnicas de estimación no paramétrica. La principal ventaja de este tipo de métodos es que permite obtener estimaciones espaciales mucho más flexibles, y por tanto se ajustan mejor al comportamiento de los datos muestrales.

POR: SERGIO CASTILLO

This browser does not support PDFs. Please download the PDF to view it: Download PDF.</p> </embed>

UN RECORRIDO POR LA ESTADÍSTICA ESPACIAL

Esta intervención proporciona un panorama general de las temáticas estudiadas en el marco de la estadística espacial: geoestadística, patrones puntuales y datos de áreas. Se presenta brevemente el fundamento teórico de cada una, los tipos de datos con los que trabajan, así como las herramientas de software que posibilitan su análisis.

POR: VICTOR MORALES-OÑATE

CONSTRUCCIÓN Y MEDICIÓN DE UN INDICADOR SOCIOECONOMICO

En este dialogo se presenta una metodología para la construcción y medición de un indicador. El primer arte es el análisis de las variables que describen el acceso a servicios, tenencia de bienes y condiciones de vida de los hogares del país en base a la información del Censo de Población y Vivienda 2010. A partir de esto se presenta el proceso de muestreo para tomar una muestra representativa dentro de cada provincia.

POR: KATHERINE MORALES

This browser does not support PDFs. Please download the PDF to view it: Download PDF.</p> </embed>

Mapas dinámicos con Highcharter


Introducción

Si no sabes que es Highcharter, puedes revisar nuestro post: Gráficos dinámicos con highcharter

Si ya lo conoces pasemos directamente a una aplicación de la función hcmap.

Mapas dinámicos - Función hcmap

La función hcmap nos permite crear mapas dinámicos de forma muy fácil, únicamente debemos seleccionar un mapa (url) de la colección highmaps y usarlo con nuestros datos y personalización deseada.

La función se encarga de descargar el mapa (tipo lista) y genera el gráfico.

library(highcharter)
## Highcharts (www.highcharts.com) is a Highsoft software product which is
## not free for commercial and Governmental use
hcmap("countries/ec/ec-all")

Una vez tenemos el gráfico debemos agregarle nuestros datos, para esto vamos a usar un dataframe que contenga una variable identificadora (provincia, estado, departamento, etc.) y la variable cuantitativa deseada, para evitar errores e ingresar manualmente los nombres de las provincias, estados o departamentos usamos la función get_data_from_map() de la siguiente forma:

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
mapdata <- get_data_from_map(download_map_data("countries/ec/ec-all"))
glimpse(mapdata)
## Observations: 25
## Variables: 19
## $ hc-group    <chr> "admin1", "admin1", "admin1", "admin1", "admin1", ...
## $ hc-middle-x <dbl> 0.44, 0.60, 0.64, 0.62, 0.58, 0.56, 0.40, 0.35, 0....
## $ hc-middle-y <dbl> 0.45, 0.47, 0.63, 0.66, 0.54, 0.61, 0.52, 0.47, 0....
## $ hc-key      <chr> "ec-gu", "ec-es", "ec-cr", "ec-im", "ec-su", "ec-s...
## $ hc-a2       <chr> "GU", "ES", "CR", "IM", "SU", "SE", "SD", "AZ", "E...
## $ labelrank   <chr> "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", ...
## $ hasc        <chr> "EC.GU", "EC.ES", "EC.CR", "EC.IM", "EC.SU", "EC.S...
## $ woe-id      <chr> "2345211", "2345210", "2345206", "2345212", "23452...
## $ fips        <chr> "EC10", "EC09", "EC05", "EC11", "EC22", "EC25", "E...
## $ postal-code <chr> "GU", "ES", "CR", "IM", "SU", "SE", "SD", "AZ", "E...
## $ name        <chr> "Guayas", "Esmeraldas", "Carchi", "Imbabura", "Suc...
## $ country     <chr> "Ecuador", "Ecuador", "Ecuador", "Ecuador", "Ecuad...
## $ type-en     <chr> "Province", "Province", "Province", "Province", "P...
## $ longitude   <chr> "-79.8608", "-78.9448", "-78.0243", "-78.412400000...
## $ woe-name    <chr> "Guayas", "Esmeraldas", "Carchi", "Imbabura", "Suc...
## $ latitude    <chr> "-1.98384", "1.29253", "0.686611", "0.55271", "-0....
## $ woe-label   <chr> "Guayas, EC, Ecuador", "Esmeraldas, EC, Ecuador", ...
## $ type        <chr> "Provincia", "Provincia", "Provincia", "Provincia"...
## $ alt-name    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...

Creamos el dataframe con la variable deseada, debemos tomar la variable hc-a2 como variable identificadora.

data_ecuador <- mapdata %>% 
  select(PROVINCIA = `hc-a2`) %>% 
  mutate(X = 1:25)
glimpse(data_ecuador)
## Observations: 25
## Variables: 2
## $ PROVINCIA <chr> "GU", "ES", "CR", "IM", "SU", "SE", "SD", "AZ", "EO"...
## $ X         <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1...

Finalmente generamos el mapa con la función hcmap de la sgiuiente forma:

hcmap("countries/ec/ec-all", data = data_ecuador, value = "X",
      joinBy = c("hc-a2", "PROVINCIA"),
      dataLabels = list(enabled = TRUE, format = '{point.name}')) 

Podemos agregar mas detalles agregando argumentos borderColor, borderWidth, tooltip, etc. y mas funciones propias de highcharter.

hcmap("countries/ec/ec-all", data = data_ecuador, value = "X",
      joinBy = c("hc-a2", "PROVINCIA"),
      dataLabels = list(enabled = TRUE, format = '{point.name}'),
      borderColor = "#FAFAFA", borderWidth = 0.5,
      tooltip = list(valueDecimals = 2, valuePrefix = "$", valueSuffix = " USD")) %>%
        hc_mapNavigation(enabled = TRUE) %>%
        hc_title(text = "Mapa dinámico de Ecuador - R Users Group - Ecuador",
                 align = "center", style = list(color = "#000000", fontWeight = "bold"))

Pero vemos que el mapa es incorrecto, la provincia TUNGURAHUA del mapa en realidad es NAPO y TUNGURAHUA está en blanco. Esto es un error del mapa.

Pero no nos preocupemos, hemos corregido el mapa y lo cargamos en nuestro repositorio en Github.

Mapa Ecuador corregido

Dado que el mapa corregido lo vamos a bajar de nuestro repositorio debemos utilizar los paquetes rjson y stringr para descargar el mapa.

easypackages::libraries(c(“highcharter”, “dplyr”, “rjson”, “stringr”))

easypackages::libraries(c("rjson", "stringr"))
## Loading required package: rjson
## Loading required package: stringr
## All packages loaded successfully

Podemos descargar el mapa y usarlo localmente con:

    dir <- ifelse(Sys.info()[[1]]!="Linux", "C:/CRISBEN/", "/mnt/hgfs/CRISBEN/")
    ecuador <- fromJSON(file = paste0(dir,"APPS/VAE/BaseMapa/ec-all.geo.json"))

O podemos usarlo directamente con:

ecuador <- fromJSON(file = "https://raw.githubusercontent.com/Rusersgroup/mapa_ecuador/master/ec-all.geo.json")

Ahora grafiquemos el mapa de Ecuador con la población por provincia de acuerdo a los datos del Censo de Población de 2010 del INEC, los cuales hemos cargado previamente en nuestro repositorio y traemos directamente con:

load(url("https://raw.githubusercontent.com/Rusersgroup/mapa_ecuador/master/poblacion_provincia_ecuador_2010.Rdata"))
glimpse(poblacion_provincia_ecuador_2010)
## Observations: 24
## Variables: 2
## $ Provincia <fctr> Azuay, Cañar, Chimborazo, Cotopaxi, El Oro, Esmeral...
## $ Poblacion <dbl> 712127, 225184, 458581, 409205, 600659, 534092, 2512...

Grafiquemos el mapa de Ecuador con unos cuantos argumentos adicionales para personalizarlo:

highchart() %>%
        hc_title(text = "<i>Mapa dinámico de Ecuador</i> - <b>R Users Group - Ecuador</b>",
           margin = 20, align = "center",
           style = list(color = "#08338F", useHTML = TRUE)) %>% 
        hc_subtitle(text = "Población por provincia",
              align = "center",
              style = list(color = "#0C5C9E", fontWeight = "bold")) %>% 
        hc_tooltip(followPointer =  FALSE) %>%
        hc_add_series_map(ecuador, poblacion_provincia_ecuador_2010, name = "Población",
                          value = "Poblacion", joinBy = c("name", "Provincia"),
                          dataLabels = list(enabled = TRUE,
                                            format = '{point.properties.woe-name}')) %>%
        hc_colorAxis(minColor = "#B7D4EB", maxColor = "#08338F")  %>%
        hc_legend(align = "center", x = 0, y = -70) %>%
        hc_mapNavigation(enabled = TRUE) %>%
        hc_add_theme(hc_theme_ffx()) %>% 
        hc_add_annotation(xValue = 0, yValue = 0, title = list(text = 'Fuente: INEC')) %>% 
        hc_chart(borderColor = "#08338F",
           borderRadius = 10,
           borderWidth = 2)

Back to Top

Provincias de Ecuador

Ahora que hemos graficado Ecuador porque no hacerlo con sus provincias, para esto creamos una función que nos permite visualizar cada provincia.

Provincia <- as.character(poblacion_provincia_ecuador_2010$Provincia)
print(Provincia)
##  [1] "Azuay"                          "Cañar"                         
##  [3] "Chimborazo"                     "Cotopaxi"                      
##  [5] "El Oro"                         "Esmeraldas"                    
##  [7] "Galapagos"                      "Guayas"                        
##  [9] "Imbabura"                       "Loja"                          
## [11] "Los Rios"                       "Manabi"                        
## [13] "Morona Santiago"                "Napo"                          
## [15] "Orellana"                       "Pastaza"                       
## [17] "Pichincha"                      "Santa Elena"                   
## [19] "Santo Domingo De Los Tsachilas" "Sucumbios"                     
## [21] "Tungurahua"                     "Zamora Chinchipe"              
## [23] "Carchi"                         "Bolivar"
#n <- readline(prompt="Ingresar numero de provincia: ")
mapa_provincia <- function() {
        n <- round(runif(1,1,24))
        nombre_aux <- Provincia[as.numeric(n)]
        print(nombre_aux)
        
        # para carga local
        # dir <- ifelse(Sys.info()[[1]]!="Linux", "C:/CRISBEN/", "/mnt/hgfs/CRISBEN/")
        # provincia <- fromJSON(file = paste0(dir,"APPS/VAE/BaseMapa/Provincias/",nombre_aux,".geo.json"))
        
        provincia <- fromJSON(file = paste0("https://raw.githubusercontent.com/Rusersgroup/mapa_ecuador/master/Provincias/", nombre_aux, ".geo.json"))
        prov_data <- data.frame(Provincia=nombre_aux, Total=nchar(nombre_aux))
        
        highchart(type = "map") %>%
                hc_tooltip(followPointer =  FALSE) %>%
                hc_add_series_map(provincia, prov_data, name = "Total Procedimientos",
                                  value = "Total", joinBy = c("name", "Provincia"),
                                  dataLabels = list(enabled = TRUE,
                                                    format = '{point.properties.name}')) %>%
                hc_legend(enabled=FALSE) %>%
                hc_mapNavigation(enabled = TRUE) %>%
                hc_add_theme(hc_theme_sandsignika())
}
mapa_provincia()
## [1] "Chimborazo"
mapa_provincia()
## [1] "Esmeraldas"
mapa_provincia()
## [1] "Loja"
mapa_provincia()
## [1] "Pastaza"

Back to Top

Introducción a gráficos dinámicos con Highcharter


Introducción

Highcharter

Highcharter es un paquete de R para crear gráficos dinámicos de Highcharts que utilizan internamente javascript.

Highcharts es una biblioteca de gráficos javascript muy madura y flexible y tiene una gran y poderosa API.

Las principales características de este paquete son:

  • Permite generar varios tipos de gráficos con el mismo estilo: dispersión, burbuja, línea, serie de tiempo, mapas de calor, treemap, gráficos de barras, redes, etc.
  • Permite generar varios objetos R con una sola función. Con la función hchart() se puede usar: data.frames, numéricos, histogramas, caracteres, densidad, factores, ts, mts, xts, stl, ohlc, acf, pronósticos, mforecast, ets, igraph, dist, dendrogram, phylo, survfit clases.
  • Soporta gráficos Highstock, gráficos de velas.
  • Soporta temas como economist, financial times, google, 538 entre otros.
  • Soporta interesante complementos de movimiento, puntos de arrastre, fuente, anotaciones entre otros.

La función hchart permite visualizar los siguientes tipos de gráficos:

    Data Frames   ·   Numeric & Histograms   ·   Densities   ·   Character & Factor   ·   Time Series   ·   Seasonal Decomposition of Time Series by Loess   ·   Forecast package   ·   igraph   ·   xts from quantmod package   ·   xts ohlc objects   ·   Autocovariance & Autocorrelation   ·   Multivariate Time series   ·   Survival Models   ·   Principal Components   ·   Matrix   ·   Distance matrix   ·   Correlation matrix

Todo esto lo puedes revisar en la web oficial de highcharter.

Gráficos dinámicos

Función hchart - “Dispersión”

easypackages::libraries(c("dplyr", "highcharter"))
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## Loading required package: highcharter
## Highcharts (www.highcharts.com) is a Highsoft software product which is
## not free for commercial and Governmental use
## All packages loaded successfully
data(diamonds, mpg, package = "ggplot2")

hchart(mpg, "scatter", hcaes(x = displ, y = hwy, group = class)) %>%
  hc_title(text = "Dispersión diamonds") %>%
  hc_add_theme(hc_theme_economist())

Función hchart - “columnas”

mpgman2 <- mpg %>%
  count(class, year) %>%
  glimpse()
## Observations: 14
## Variables: 3
## $ class <chr> "2seater", "2seater", "compact", "compact", "midsize", "...
## $ year  <int> 1999, 2008, 1999, 2008, 1999, 2008, 1999, 2008, 1999, 20...
## $ n     <int> 2, 3, 25, 22, 20, 21, 6, 5, 16, 17, 19, 16, 29, 33
hchart(mpgman2, "column", hcaes(x = class, y = n, group = year)) %>% hc_add_theme(hc_theme_darkunica())

Función hchart - “barras”

hchart(mpgman2, "bar", hcaes(x = class, y = n, group = year))  %>% hc_add_theme(hc_theme_gridlight())

Función hchart - “treemap”

mpgman3 <- mpg %>% 
  group_by(manufacturer) %>% 
  summarise(n = n(), unique = length(unique(model))) %>% 
  arrange(-n, -unique) %>% 
  glimpse()
## Observations: 15
## Variables: 3
## $ manufacturer <chr> "dodge", "toyota", "volkswagen", "ford", "chevrol...
## $ n            <int> 37, 34, 27, 25, 19, 18, 14, 14, 13, 9, 8, 5, 4, 4, 3
## $ unique       <int> 4, 6, 4, 4, 4, 3, 2, 2, 3, 1, 1, 1, 1, 1, 1
hchart(mpgman3, "treemap", hcaes(x = manufacturer, value = n, color = unique)) 

Función hchart - “lineal”

library(ggplot2)
economics_long2 <- economics_long %>% 
  filter(variable %in% c("pop", "uempmed", "unemploy")) %>% 
  print()
## Source: local data frame [1,722 x 4]
## Groups: variable [3]
## 
##          date variable  value     value01
##        <date>   <fctr>  <dbl>       <dbl>
## 1  1967-07-01      pop 198712 0.000000000
## 2  1967-08-01      pop 198911 0.001628811
## 3  1967-09-01      pop 199113 0.003282177
## 4  1967-10-01      pop 199311 0.004902803
## 5  1967-11-01      pop 199498 0.006433395
## 6  1967-12-01      pop 199657 0.007734807
## 7  1968-01-01      pop 199808 0.008970739
## 8  1968-02-01      pop 199920 0.009887457
## 9  1968-03-01      pop 200056 0.011000614
## 10 1968-04-01      pop 200208 0.012244731
## # ... with 1,712 more rows
hchart(economics_long2, "line", hcaes(x = date, y = value01, group = variable)) %>% hc_add_theme(hc_theme_google())

Función hchart - “numérico o histograma”

hchart(diamonds$price) %>% hc_add_theme(hc_theme_elementary())

Función hchart - “sectores”

hchart(mpgman2 %>% filter(year==2008) , "pie", hcaes(x = class, y = n)) %>% hc_add_theme(hc_theme_538())

Función hchart - “densidad”

hchart(density(diamonds$price), type = "area", color = "#B71C1C", name = "Price") %>% hc_add_theme(hc_theme_elementary())

Función hchart - “quantmod”

library(quantmod)
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
## 
##     first, last
## Loading required package: TTR
## Version 0.4-0 included new data defaults. See ?getSymbols.
x <- getSymbols("USD/JPY", src = "oanda", auto.assign = FALSE)
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
## 
## This message is shown once per session and may be disabled by setting 
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
hchart(x)

Función hchart - “forecast”

library("forecast")
airforecast <- forecast(auto.arima(AirPassengers), level = 95)
hchart(airforecast) %>% hc_add_theme(hc_theme_sandsignika())

Función hchart - “Componentes Principales”

hchart(princomp(USArrests, cor = TRUE)) %>% hc_add_theme(hc_theme_538())

Boxplot

data(diamonds, package = "ggplot2")

hcboxplot(x = diamonds$x, var = diamonds$color,
          name = "Length", color = "#2980b9") %>%
  hc_add_theme(hc_theme_economist())

Gráfico de barras y de sectores incrustado

data("favorite_bars")
data("favorite_pies")

highchart() %>%
  # Data
  hc_add_series(favorite_pies, "column", hcaes(x = pie, y = percent), name = "Pie") %>%
  hc_add_series(favorite_bars, "pie", hcaes(name = bar, y = percent), name = "Bars") %>% 
        hc_add_theme(hc_theme_ffx()) %>%
  # Optiosn for each type of series
  hc_plotOptions(
    series = list(
      showInLegend = FALSE,
      pointFormat = "{point.y}%"
    ),
    column = list(
      colorByPoint = TRUE
    ),
    pie = list(
      colorByPoint = TRUE, center = c('30%', '10%'),
      size = 120, dataLabels = list(enabled = FALSE)
    )) %>%
  # Axis
  hc_yAxis(
    title = list(text = "percentage of tastiness"),
    labels = list(format = "{value}%"), max = 100
  ) %>%
  hc_xAxis(categories = favorite_pies$pie) %>%
  # Titles and credits
  hc_title(
    text = "This is a bar graph describing my favorite pies
    including a pie chart describing my favorite bars"
  ) %>%
  hc_subtitle(text = "In percentage of tastiness and awesomeness") %>%
  hc_credits(
    enabled = TRUE, text = "Source: HIMYM",
    style = list(fontSize = "12px")
  )

Mapas dinámicos

mapdata <- get_data_from_map(download_map_data("countries/us/us-all"))
glimpse(mapdata)
## Observations: 52
## Variables: 19
## $ hc-group    <chr> "admin1", "admin1", "admin1", "admin1", "admin1", ...
## $ hc-middle-x <dbl> 0.36, 0.56, 0.51, 0.47, 0.41, 0.43, 0.71, 0.46, 0....
## $ hc-middle-y <dbl> 0.47, 0.52, 0.67, 0.52, 0.38, 0.40, 0.67, 0.38, 0....
## $ hc-key      <chr> "us-ma", "us-wa", "us-ca", "us-or", "us-wi", "us-m...
## $ hc-a2       <chr> "MA", "WA", "CA", "OR", "WI", "ME", "MI", "NV", "N...
## $ labelrank   <chr> "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", ...
## $ hasc        <chr> "US.MA", "US.WA", "US.CA", "US.OR", "US.WI", "US.M...
## $ woe-id      <chr> "2347580", "2347606", "2347563", "2347596", "23476...
## $ state-fips  <chr> "25", "53", "6", "41", "55", "23", "26", "32", "35...
## $ fips        <chr> "US25", "US53", "US06", "US41", "US55", "US23", "U...
## $ postal-code <chr> "MA", "WA", "CA", "OR", "WI", "ME", "MI", "NV", "N...
## $ name        <chr> "Massachusetts", "Washington", "California", "Oreg...
## $ country     <chr> "United States of America", "United States of Amer...
## $ region      <chr> "Northeast", "West", "West", "West", "Midwest", "N...
## $ longitude   <chr> "-71.99930000000001", "-120.361", "-119.591", "-12...
## $ woe-name    <chr> "Massachusetts", "Washington", "California", "Oreg...
## $ latitude    <chr> "42.3739", "47.4865", "36.7496", "43.8333", "44.37...
## $ woe-label   <chr> "Massachusetts, US, United States", "Washington, U...
## $ type        <chr> "State", "State", "State", "State", "State", "Stat...
set.seed(1234)

data_fake <- mapdata %>% 
  select(code = `hc-a2`) %>% 
  mutate(value = 1e5 * abs(rt(nrow(.), df = 10)))

glimpse(data_fake)
## Observations: 52
## Variables: 2
## $ code  <chr> "MA", "WA", "CA", "OR", "WI", "ME", "MI", "NV", "NM", "C...
## $ value <dbl> 119426.518, 255662.317, 3668.575, 122246.930, 79283.064,...
hcmap("countries/us/us-all", data = data_fake, value = "value",
      joinBy = c("hc-a2", "code"), name = "Fake data",
      dataLabels = list(enabled = TRUE, format = '{point.name}'),
      borderColor = "#0EAD82", borderWidth = 0.1,
      tooltip = list(valueDecimals = 2, valuePrefix = "$", valueSuffix = " USD")) 

º

Escuela de R-Estadística 3ra edición - 2017

Escuela de R-Estadística

En el 2013 tuvo lugar la primera Escuela de R-Estadística siendo un éxito rotundo al difundir el uso de las técnicas estadísticas mediante el uso de software libre, desde su primera edición se ha caracterizado por contar con un staff de facilitadores del más alto nivel. Ahora en su 3ra edición nuestro principal interés es mantener el mismo estándar de ediciones anteriores y reiterar nuestro compromiso de brindar a la comunidad un servicio de calidad que contribuya en sus diversos campos profesionales.

OBJETIVO DE LA ESCUELA

El objetivo de la escuela es actualizar-ampliar los conocimientos en la optimización de la gestión de información cuantitativa empoderando al participante de destrezas en el manejo del software R en data management, estructuras de programación, estadística descriptiva, muestreo, gráficas de alto nivel, modelos lineales, series de tiempo, reportería dinámica y visualización en base a aplicaciones y casos prácticos

DESCRIPCIÓN

La escuela abarca el contenido necesario para que el participante, empezando de cero el uso del software, aprenda a través de los diferentes módulos varias herramientas de análisis de datos hasta llegar a presentar la información de forma dinámica. Se arranca desde la instalación y configuración del software necesario para el entorno de programación estadística, la discusión de los conceptos del lenguaje de programación genéricos, se revisan aspectos teórico-prácticos de la estadística, bases de datos, escritura de funciones, agregación de bases de datos, análisis de encuestas por muestreo, herramientas gráficas. También incorpora manipulación avanzada de datos, modelos lineales, logit, probit, series de tiempo, reportería dinámica, aplicaciones Web, RStudio Server, Shiny Server e integración con bases de datos SQL.

✴MODULO 1

✔ Introducción al uso de R como lenguaje de programación estadístico

✴MODULO 2

✔ Análisis de regresión lineal y variable discreta

✴MODULO 3

✔ Econometría de series de tiempo

✴MODULO 4

✔ Reportería Dinámica y Visualización con R

✴ MODALIDAD Y HORARIOS

🚙 REGULAR

🕒 HORARIOS

HORARIOS ENTRE SEMANA:

Lunes a viernes 18:00 A 21:00

Módulo 1: 16 al 19 y del 23 al 25 de octubre

Módulo 2: 6 al 9 y del 13 al 15 de noviembre

Módulo 3: 20 al 23 y del 27 al 29 de noviembre

Módulo 4: 11 al 14 de diciembre y del 18 al 20 de diciembre

✈ INTENSIVO

HORARIO INTENSIVO:

Viernes 18:00 a 21:00, Sábado y domingo de 8:00 A 17:00

Módulo 1: 13, 14 y 15 de octubre

Módulo 2: 20, 21 y 22 de octubre

Módulo 3: 27, 28 y 29 de octubre

Módulo 4: 10, 11 y 12 de noviembre

✴TOTAL DE HORAS

✔ 25 Horas por módulo

Si estás interesado/a en la Escuela de R - Estadística, realiza tu preinscripción en el siguiente link: https://goo.gl/forms/gNDrhvxo9rYrgXCN2

La Escuela de R-Estadística es organizado por la Sociedad Ecuatoriana de Estadística con el apoyo del R Users Group - Ecuador

✴ Mayor información:

Información

Por el Día Mundial de la Estadística - conCienciArte 2

Por el Día Mundial de la Estadística conCienciArte / 2nd edition

La Sociedad Ecuatoriana de Estadística y el R Users Group - Ecuador te invitan a la segunda edición de este meet-up con exponentes que hacen de la forma de presentar la información estadística un arte; un espacio para la creatividad y el networking.

El motivo que nos atañe esta vez es rendir homenaje a todos aquellos que contribuyen a que la estadística sea un instrumento valioso en la toma de decisiones en el quehacer de sus múltiples campos de investigación.

CIENCIA

Roberto Castillo, Subdirector Ejecutivo del INEC

Lilia Quituisaca, Numérica I+D

Julia Helena Carrillo, country manager de IPSOS Consultor

ARTE

Juan Miranda, poeta

Daniela Sandoval, bailarina

Darío Ramos, poeta

R Tips - Reportería en excel con R y xlsx


Reportería en excel con R y xlsx

En el ambito laboral generalmente presentamos resultados, reportes, tablas, etc. en archivos excel, si bien usamos R para limpieza y procesamiento, entonces ¿porque no usarlo para presentación de resultados?

En esta publicación abordamos la presentación de resultados en archivos excel con el paquete xlsx.

Xlsx es uno de los paquetes mas reconocidos para lectura y escritura de archivos excel. Es una solución basada en java y está disponible para Windows, Mac y Linux. Funciona para los formatos xls y xlsx.

Para instalar y cargar el paquete utilizamos:

install.packages("xlsx", dependencies = T)
library("xlsx")

Nota: Es necesario instalar java antes de ejecutar esto, ya que xlsx depende de los paquetes rJava y xlsxjars, los cuales no funcionarán si no tenemos java en el equipo.

Back to Top

Formato tradicional

Una vez cargado el paquete usamos la función write.xlsx

library("xlsx")
## Loading required package: rJava
## Loading required package: xlsxjars
write.xlsx(mtcars, file = "prueba.xlsx", sheetName = "mtcars")

Con lo cual vamos a obtener un archivo excel como este:

R Users Group - Ecuador

Para agregar varios conjuntos de datos en el mismo archivo excel, pero en hojas distintas usamos el argumento append = TRUE, de esta forma:

write.xlsx(airquality, file = "prueba.xlsx", sheetName = "airquality", append = T)

Con lo cual vamos a obtener un archivo excel como este:

R Users Group - Ecuador

Si no colocamos el argumento append unicamente vamos a reemplazar el archivo.

Back to Top

Formato personalizado

Ahora si deseamos un formato personalizado podemos usar la siguiente función y modificarla de acuerdo a nuestras necesidades:

exportar <- function(datos, archivo){        
  wb <- createWorkbook(type="xlsx")
  
  # Estilos de celdas
  # Estilos de titulos y subtitulos
  titulo <- CellStyle(wb)+ Font(wb,  heightInPoints=16, isBold=TRUE)
  
  subtitulo <- CellStyle(wb) + Font(wb,  heightInPoints=12,
                                          isItalic=TRUE, isBold=FALSE)
  
  # Estilo de tablas
  filas <- CellStyle(wb) + Font(wb, isBold=TRUE)
  
  columnas <- CellStyle(wb) + Font(wb, isBold=TRUE) +
    Alignment(vertical="VERTICAL_CENTER",wrapText=TRUE, horizontal="ALIGN_CENTER") +
    Border(color="black", position=c("TOP", "BOTTOM"), 
           pen=c("BORDER_THICK", "BORDER_THICK"))+Fill(foregroundColor = "lightblue", pattern = "SOLID_FOREGROUND")
  
  # Crear una hoja
  sheet <- createSheet(wb, sheetName = "Información - R Users Group - Ecuador")
  
  # Funcion linea (agregar texto)
  linea<-function(sheet, rowIndex, title, titleStyle){
    rows <- createRow(sheet, rowIndex=rowIndex)
    sheetTitle <- createCell(rows, colIndex=1)
    setCellValue(sheetTitle[[1,1]], title)
    setCellStyle(sheetTitle[[1,1]], titleStyle)
  }
  
  # Agregamos titulos,  subtitulos, etc.
  linea(sheet, rowIndex=8, 
                title=paste("Fecha:", format(Sys.Date(), format="%Y/%m/%d")),
                titleStyle = subtitulo)
  
  linea(sheet, rowIndex=9, 
                title="Elaborado por: R Users Group - Ecuador",
                titleStyle = subtitulo)
  
  linea(sheet, rowIndex=11, 
                paste("Información de prueba"),
                titleStyle = titulo)
  
  # Tablas
  addDataFrame(datos,
               sheet, startRow=13, startColumn=1,
               colnamesStyle = columnas,
               rownamesStyle = filas,
               row.names = F)
  
  # Ancho de columnas
  setColumnWidth(sheet, colIndex=c(1:ncol(datos)), colWidth=15)
  
  # Imagen    Cambia la ruta por la que de tu imagen
  addPicture("C:/final5x5.png", sheet, scale=0.75, startRow = 1, startColumn = 1)
  
  # Guardar
  saveWorkbook(wb, archivo)
}

exportar(mtcars, "R Users Group - Ecuador - mtcars.xlsx")

Con lo cual vamos a obtener un archivo excel como este:

R Users Group - Ecuador

Si necesitamos varias páginas y/o tablas en el mismo documento podemos agregar mas argumentos hasta cubrir nuesras necesidades.

Para mas hojas usamos la función createSheet y guardamos la hoja con otro nombre:

sheet_extra <- createSheet(wb, sheetName = "Página 2 - R Users Group - Ecuador")

Para agregar texto, tablas, imágenes y demás en esta nueva página debemos usar las funciones linea, addDataFrame, addPicture, etc. con el argumento sheet_extra

linea(sheet_extra, rowIndex=9, 
            title="Elaborado por: R Users Group - Ecuador",
            titleStyle = subtitulo)

Podemos usar el mismo estilo en todas las hojas o cambiarlo de acuerdo a nuestros gustos y necesidades, al igual que los títulos, subtítulos, etc.

Si realizamos reportes similares a diario, o requerimos exportar varios archivos podemos aplicar estas funciones dentro de condicionales while o for y volverlo un proceso automático.

Back to Top

R Tips - Instalación y carga simultánea de librerías


Instalación y carga de librerías

Si usas R, sabes que una de sus grandes ventajas es la ampliación de sus funcionalidades mediantes paquetes o librerías.

Te presentamos varios tips a fin de acelerar el proceso de instalación y carga de tus librerías.

Instalación normal

install.packages("xts")

Instalación normal con todas sus dependencias

install.packages("dplyr", dependencies = T)

Si por alguna razón necesitamos los paquetes en zip los guardamos con el argumento destdir.

install.packages("ineq", destdir = "C:/temp")

Lo cual también aplica para descargar un paquete con todas sus dependencias.

install.packages("tm", dependencies = T, destdir = "C:/temp")
Installing package into �C:/Users/crbdl/Documents/R/win-library/3.4�
(as �lib� is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.4/ineq_0.2-13.zip'
Content type 'application/zip' length 67130 bytes (65 KB)
downloaded 65 KB
package ‘ineq’ successfully unpacked and MD5 sums checked
Installing package into �C:/Users/crbdl/Documents/R/win-library/3.4�
(as �lib� is unspecified)
Warning in install.packages :
dependencies ‘Rcampdf’, ‘Rgraphviz’, ‘Rpoppler’, ‘tm.lexicon.GeneralInquirer’ are not available
also installing the dependencies �NLP�, �slam�, �filehash�, �SnowballC�, �XML�
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.4/NLP_0.1-11.zip'
Content type 'application/zip' length 293996 bytes (287 KB)
downloaded 287 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.4/slam_0.1-40.zip'
Content type 'application/zip' length 118237 bytes (115 KB)
downloaded 115 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.4/filehash_2.4-1.zip'
Content type 'application/zip' length 275509 bytes (269 KB)
downloaded 269 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.4/SnowballC_0.5.1.zip'
Content type 'application/zip' length 3082209 bytes (2.9 MB)
downloaded 2.9 MB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.4/XML_3.98-1.9.zip'
Content type 'application/zip' length 4323674 bytes (4.1 MB)
downloaded 4.1 MB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.4/tm_0.7-1.zip'
Content type 'application/zip' length 1274636 bytes (1.2 MB)
downloaded 1.2 MB
package ‘NLP’ successfully unpacked and MD5 sums checked
package ‘slam’ successfully unpacked and MD5 sums checked
package ‘filehash’ successfully unpacked and MD5 sums checked
package ‘SnowballC’ successfully unpacked and MD5 sums checked
package ‘XML’ successfully unpacked and MD5 sums checked
package ‘tm’ successfully unpacked and MD5 sums checked

Una vez que hayas instalado un paquete debes cargarlo para poder usas sus funciones o información.

Carga normal

library(dplyr)
require(dplyr)

Ambas funciones cumplen la función de carga, pero ¿en que se diferencian?

La principal diferencia entre estas funciones es:

Por defecto, library() devuelve un error si el paquete solicitado no existe.

library(abcd)
Error in library(abcd) : there is no package called ‘abcd’

Mientras requiere() da una advertencia.

require(abcd)
## Loading required package: abcd
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : there is no package called 'abcd'

require () está diseñado para ser utilizado dentro de funciones, ya que da un mensaje de advertencia y devuelve un valor lógico decir, FALSE si el paquete solicitado no se encuentra y TRUE si el paquete está cargado.

ifelse(require(dplyr)==T, "Cargado", "No cargado")
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## [1] "Cargado"
# 0=FALSE

sum(require(abcd))
## Loading required package: abcd
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : there is no package called 'abcd'
## [1] 0

La mejor opción es utilizar library(), ya que da el mensaje de error si el paquete no se encuentra durante el tiempo de carga del paquete, lo cual nos dará una alerta temprana y evitará continuar generando errores innecesarios.

Back to Top

Usar función sin cargar librería

Podemos utilizar una función de un paquete sin cargarlo, cargando únicamente dicha función de la siguiente forma:

rpart::car.test.frame
##                               Price   Country Reliability Mileage    Type
## Eagle Summit 4                 8895       USA           4      33   Small
## Ford Escort   4                7402       USA           2      33   Small
## Ford Festiva 4                 6319     Korea           4      37   Small
## Honda Civic 4                  6635 Japan/USA           5      32   Small
## Mazda Protege 4                6599     Japan           5      32   Small
## Mercury Tracer 4               8672    Mexico           4      26   Small
## Nissan Sentra 4                7399 Japan/USA           5      33   Small
## Pontiac LeMans 4               7254     Korea           1      28   Small
## Subaru Loyale 4                9599     Japan           5      25   Small
## Subaru Justy 3                 5866     Japan          NA      34   Small
## Toyota Corolla 4               8748 Japan/USA           5      29   Small
## Toyota Tercel 4                6488     Japan           5      35   Small
## Volkswagen Jetta 4             9995   Germany           3      26   Small
## Chevrolet Camaro V8           11545       USA           1      20  Sporty
## Dodge Daytona                  9745       USA           1      27  Sporty
## Ford Mustang V8               12164       USA           1      19  Sporty
## Ford Probe                    11470       USA           3      30  Sporty
## Honda Civic CRX Si 4           9410     Japan           5      33  Sporty
## Honda Prelude Si 4WS 4        13945     Japan           5      27  Sporty
## Nissan 240SX 4                13249     Japan           3      24  Sporty
## Plymouth Laser                10855       USA          NA      26  Sporty
## Subaru XT 4                   13071     Japan          NA      28  Sporty
## Audi 80 4                     18900   Germany          NA      27 Compact
## Buick Skylark 4               10565       USA           2      23 Compact
## Chevrolet Beretta 4           10320       USA           1      26 Compact
## Chrysler Le Baron V6          10945       USA           4      25 Compact
## Ford Tempo 4                   9483       USA           2      24 Compact
## Honda Accord 4                12145 Japan/USA           5      26 Compact
## Mazda 626 4                   12459 Japan/USA           4      24 Compact
## Mitsubishi Galant 4           10989     Japan           5      25 Compact
## Mitsubishi Sigma V6           17879     Japan           4      21 Compact
## Nissan Stanza 4               11650     Japan           5      21 Compact
## Oldsmobile Calais 4            9995       USA           2      23 Compact
## Peugeot 405 4                 15930    France          NA      24 Compact
## Subaru Legacy 4               11499 Japan/USA           5      23 Compact
## Toyota Camry 4                11588 Japan/USA           5      27 Compact
## Volvo 240 4                   18450    Sweden           3      23 Compact
## Acura Legend V6               24760     Japan           5      20  Medium
## Buick Century 4               13150       USA           3      21  Medium
## Chrysler Le Baron Coupe       12495       USA           2      22  Medium
## Chrysler New Yorker V6        16342       USA           3      22  Medium
## Eagle Premier V6              15350       USA           2      22  Medium
## Ford Taurus V6                13195       USA           3      22  Medium
## Ford Thunderbird V6           14980       USA           1      23  Medium
## Hyundai Sonata 4               9999     Korea          NA      23  Medium
## Mazda 929 V6                  23300     Japan           5      21  Medium
## Nissan Maxima V6              17899     Japan           5      22  Medium
## Oldsmobile Cutlass Ciera 4    13150       USA           2      21  Medium
## Oldsmobile Cutlass Supreme V6 14495       USA          NA      21  Medium
## Toyota Cressida 6             21498     Japan           3      23  Medium
## Buick Le Sabre V6             16145       USA           3      23   Large
## Chevrolet Caprice V8          14525       USA           1      18   Large
## Ford LTD Crown Victoria V8    17257       USA           3      20   Large
## Chevrolet Lumina APV V6       13995       USA          NA      18     Van
## Dodge Grand Caravan V6        15395       USA           3      18     Van
## Ford Aerostar V6              12267       USA           3      18     Van
## Mazda MPV V6                  14944     Japan           5      19     Van
## Mitsubishi Wagon 4            14929     Japan          NA      20     Van
## Nissan Axxess 4               13949     Japan          NA      20     Van
## Nissan Van 4                  14799     Japan          NA      19     Van
##                               Weight Disp.  HP
## Eagle Summit 4                  2560    97 113
## Ford Escort   4                 2345   114  90
## Ford Festiva 4                  1845    81  63
## Honda Civic 4                   2260    91  92
## Mazda Protege 4                 2440   113 103
## Mercury Tracer 4                2285    97  82
## Nissan Sentra 4                 2275    97  90
## Pontiac LeMans 4                2350    98  74
## Subaru Loyale 4                 2295   109  90
## Subaru Justy 3                  1900    73  73
## Toyota Corolla 4                2390    97 102
## Toyota Tercel 4                 2075    89  78
## Volkswagen Jetta 4              2330   109 100
## Chevrolet Camaro V8             3320   305 170
## Dodge Daytona                   2885   153 100
## Ford Mustang V8                 3310   302 225
## Ford Probe                      2695   133 110
## Honda Civic CRX Si 4            2170    97 108
## Honda Prelude Si 4WS 4          2710   125 140
## Nissan 240SX 4                  2775   146 140
## Plymouth Laser                  2840   107  92
## Subaru XT 4                     2485   109  97
## Audi 80 4                       2670   121 108
## Buick Skylark 4                 2640   151 110
## Chevrolet Beretta 4             2655   133  95
## Chrysler Le Baron V6            3065   181 141
## Ford Tempo 4                    2750   141  98
## Honda Accord 4                  2920   132 125
## Mazda 626 4                     2780   133 110
## Mitsubishi Galant 4             2745   122 102
## Mitsubishi Sigma V6             3110   181 142
## Nissan Stanza 4                 2920   146 138
## Oldsmobile Calais 4             2645   151 110
## Peugeot 405 4                   2575   116 120
## Subaru Legacy 4                 2935   135 130
## Toyota Camry 4                  2920   122 115
## Volvo 240 4                     2985   141 114
## Acura Legend V6                 3265   163 160
## Buick Century 4                 2880   151 110
## Chrysler Le Baron Coupe         2975   153 150
## Chrysler New Yorker V6          3450   202 147
## Eagle Premier V6                3145   180 150
## Ford Taurus V6                  3190   182 140
## Ford Thunderbird V6             3610   232 140
## Hyundai Sonata 4                2885   143 110
## Mazda 929 V6                    3480   180 158
## Nissan Maxima V6                3200   180 160
## Oldsmobile Cutlass Ciera 4      2765   151 110
## Oldsmobile Cutlass Supreme V6   3220   189 135
## Toyota Cressida 6               3480   180 190
## Buick Le Sabre V6               3325   231 165
## Chevrolet Caprice V8            3855   305 170
## Ford LTD Crown Victoria V8      3850   302 150
## Chevrolet Lumina APV V6         3195   151 110
## Dodge Grand Caravan V6          3735   202 150
## Ford Aerostar V6                3665   182 145
## Mazda MPV V6                    3735   181 150
## Mitsubishi Wagon 4              3415   143 107
## Nissan Axxess 4                 3185   146 138
## Nissan Van 4                    3690   146 106

Back to Top

Carga e instalación simultánea

Carga de varios paquetes en una lìnea. En este caso usamos require ya que nos devuelve un valor lógico.

p <- c("dplyr", "tm")
sapply(p, require, character.only = TRUE)              
## Loading required package: tm
## Loading required package: NLP
## dplyr    tm 
##  TRUE  TRUE

Usamos una función del paquete tm para comprobar su carga.

removeNumbers("R 1 Users 2 Group 3- Ecuador")
## [1] "R  Users  Group - Ecuador"

También podemos instalar varios paquetes en una línea con la forma anterior cambiando la función por install.packages(), pero en su lugar vamos a usar paquetes adicionales.

easypackages permite cargar e instalar varios paquetes con las funciones libraries() y packages() respectivamente.

#install.packages("easypackages")
library("easypackages")
paq <- c("raster", "git2r")
libraries(paq)
## Loading required package: raster
## Loading required package: sp
## 
## Attaching package: 'raster'
## The following object is masked from 'package:dplyr':
## 
##     select
## Loading required package: git2r
## 
## Attaching package: 'git2r'
## The following object is masked from 'package:raster':
## 
##     init
## The following object is masked from 'package:NLP':
## 
##     content
## The following object is masked from 'package:dplyr':
## 
##     pull
## All packages loaded successfully

Si algún paquete ya existe no lo vuelve a instalar, solamente instala los faltantes.

paq <- c("ggplot2", "flexdashboard")
packages(paq)
The following package is not installed: flexdashboard
Would you like to install this package now? [y/n]
1: y
Installing package into �C:/Users/crbdl/Documents/R/win-library/3.4�
(as �lib� is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.4/flexdashboard_0.5.zip'
Content type 'application/zip' length 649070 bytes (633 KB)
downloaded 633 KB
package ‘flexdashboard’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\crbdl\AppData\Local\Temp\RtmpK6QNvA\downloaded_packages
All packages installed successfully
Loading required package: ggplot2
Attaching package: �ggplot2�
The following objects are masked from �package:psych�:
%+%, alpha
Loading required package: flexdashboard
All packages loaded successfully

lubripack permite cargar e instalar varios paquetes a la vez y nos devuelve valores lógicos si la carga o instalación se realizan correctamente.

install.packages("lubripack")

Ya que no está actualizado el paquete para mi versión de R no puedo instalarla directamente del CRAN, pero al ser una función pequeña la copio:

lubripack <- function(...,silent=FALSE){
        
        #check names and run 'require' function over if the given package is installed
        requirePkg<- function(pkg){if(length(setdiff(pkg,rownames(installed.packages())))==0)
                require(pkg, quietly = TRUE,character.only = TRUE)
        }
        
        # list of packages to install and load
        packages <- as.vector(unlist(list(...)))
        if(!is.character(packages))stop("No numeric allowed! Input must contain package names to install and load")
        
        if (length(setdiff(packages,rownames(installed.packages()))) > 0 )
                install.packages(setdiff(packages,rownames(installed.packages())),
                                 repos = c("https://cran.revolutionanalytics.com/", "http://owi.usgs.gov/R/"))
        
        res<- unlist(sapply(packages, requirePkg))
        
        if(silent == FALSE && !is.null(res)) {cat("\nBellow Packages Successfully Installed:\n\n")
                print(res)
        }
}

Esta función permite cargar paquetes declarados en un vector y no se han instalado, se instalan desde el CRAN o desde OWI y devuelve valores lógicos.

c(paq,"ggvis") -> varios
lubripack(varios)
Installing package into �C:/Users/crbdl/Documents/R/win-library/3.4�
(as �lib� is unspecified)
trying URL 'https://cran.revolutionanalytics.com/bin/windows/contrib/3.4/ggvis_0.4.3.zip'
Content type 'application/zip' length 959625 bytes (937 KB)
downloaded 937 KB
package ‘ggvis’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\crbdl\AppData\Local\Temp\RtmpK6QNvA\downloaded_packages
Attaching package: �ggvis�
The following object is masked from �package:ggplot2�:
resolution

Bellow Packages Successfully Installed:

  ggplot2 flexdashboard         ggvis 
     TRUE          TRUE          TRUE 

El paquete pacman permite cargar e instalar varios paquetes a la vez con sus funciones p_load y p_install respectivamente.

#install.packages("pacman")
library("pacman")
p_load(dplyr, psych, tm) 

p_install(NLP)
## The following packages have been unloaded:
## NLP
## Installing package into 'C:/Users/crbdl/Documents/R/win-library/3.3'
## (as 'lib' is unspecified)
## package 'NLP' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\crbdl\AppData\Local\Temp\RtmpUnc4w1\downloaded_packages
## 
## NLP installed

Back to Top

Instalación desde otros repositorios

Por defecto descargamos desde CRAN, pero no son las únicas opciones, tenemos varios repositorios como GRAN, MRAN, Bioconductor, Github, etc.

Para descargar paquetes desde estos repositorios podemos usar la función install.packages() con el argumento repos:

install.packages("smwrData", repos=c("https://owi.usgs.gov/R",getOption("repos")))
Installing package into �C:/Users/crbdl/Documents/R/win-library/3.4�
(as �lib� is unspecified)
trying URL 'https://owi.usgs.gov/R/bin/windows/contrib/3.4/smwrData_1.1.2.zip'
Content type 'application/x-zip-compressed' length 351710 bytes (343 KB)
downloaded 343 KB
package ‘smwrData’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\crbdl\AppData\Local\Temp\RtmpK6QNvA\downloaded_packages
library(smwrData)

Para descargar desde github podemos usar la función install_git().

library(devtools)
install_git("git://github.com/hadley/stringr.git")
## Downloading git repo git://github.com/hadley/stringr.git
## Installing stringr
## "C:/PROGRA~1/R/R-33~1.3/bin/x64/R" --no-site-file --no-environ --no-save  \
##   --no-restore --quiet CMD INSTALL  \
##   "C:/Users/crbdl/AppData/Local/Temp/RtmpUnc4w1/fileddc35ab6f3"  \
##   --library="C:/Users/crbdl/Documents/R/win-library/3.3" --install-tests
## 

Desde bioconductor

source("https://bioconductor.org/biocLite.R")
biocLite(c("survival"))
BioC_mirror: https://bioconductor.org
Using Bioconductor 3.5 (BiocInstaller 1.26.1), R 3.4.1 (2017-06-30).
Installing package(s) �survival�
cannot open URL 'https://bioconductor.org/packages/3.5/data/annotation/bin/windows/contrib/3.4/PACKAGES.rds': HTTP status was '404 Not             Found'cannot open URL 'https://bioconductor.org/packages/3.5/data/experiment/bin/windows/contrib/3.4/PACKAGES.rds': HTTP status was '404 Not       Found'trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.4/survival_2.41-3.zip'
Content type 'application/zip' length 5427811 bytes (5.2 MB)
downloaded 5.2 MB
package ‘survival’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\crbdl\AppData\Local\Temp\RtmpK6QNvA\downloaded_packages
installation path not writeable, unable to update packages: BH, boot, car, caret, crayon, curl, DBI, dplyr, evaluate, foreign, glmnet,
haven, htmlwidgets, httpuv, httr, knitr, Matrix, mgcv, modelr, openssl, PKI, psych, purrr, quantmod, R6, Rcpp, repr, rlang, rmarkdown,
rsconnect, rstudioapi, scales, shiny, tibble, tidyr, TTR, xts
Old packages: 'backports'
Update all/some/none? [a/s/n]: 

II Encuentro de Cientificos de Datos

II Encuentro de Cientificos de Datos en Quito

Esta noche hablaremos sobre Inteligencia Artificial (AI) y herramientas open source relacionadas. También, abriremos un espacio para los interesados en presentar sus proyectos de AI. ¡Y muchas sorpresas más!

Así que, si tienes un proyecto de Al que resuelva alguna necesidad de negocio y que te gustaría presentar contáctate con marcos.armas@handytec.mobi. ¡Estaremos felices de apoyar la difusión de tu proyecto!

Te invitamos a separar pronto tu lugar ya que tenemos cupos limitados: https://handytec.typeform.com/to/SZvAmR

Asiste, participa y sé parte de esta gran comunidad de Científicos de Datos.

¡Te esperamos!

Ejemplo de reactivos en Shiny

¿Quieres iniciar o especializarte en el desarrollo de aplicaciones shiny?

Te compartimos esta app.

Shinyapp básica

  • Síguenos en nuestras redes, más adelante compartiremos el código de ésta y varias aplicaciones.

Guía completa markdown y su integración con R


¿Qué es Markdown?

Markdown es un lenguaje de marcado ligero parecido al que se emplea en muchas wikis y basado originalmente en convenciones existentes en el marcado de los los correos electronicos. Emplea texto plano, procurando que sea legible pero consiguiendo que se convierta en XHTML correctamente formateado.

Todas las publicaciones de R Users Group - Ecuador están elaboradas empleando markdown, sin utilizar ningún tipo de editor visual, lo que facilita el crear documentos XHTML limpios y fácilmente editables.

Aunque no es muy conocido, empieza a ser muy popular y utilizado entre los programadores.

Sintaxis Markdown

Cabeceras (Títulos y subtítulos)

Las cabeceras HTML se producen colocando un número determinado de signos # antes del texto correspondiente al nivel de encabezamiento deseado (HTML ofrece hasta seis niveles). Los encabezamientos posibles se pueden ver en la siguiente tabla:

# Esto es un H1
## Esto es un H2
### Esto es un H3
#### Esto es un H4
##### Esto es un H5
###### Esto es un H6
    

Esto es un H1

Esto es un H2

Esto es un H3

Esto es un H4

Esto es un H5
Esto es un H6

Para las cabeceras de los dos primeros niveles también existe otra manera de hacer lo mismo:

Esto es un H1
=============
Esto es un H2
-------------

Esto es un H1

Esto es un H2

Texto plano y párrafos

Texto cualquiera, si al finalizar la linea colocamos dos espacios en blanco es un nuevo párrafo.

Texto normal.
Texto con 2 espacios al final.  
Texto normal.

Texto normal. Texto con 2 espacios al final.
Texto normal.

Viñetas y listas numeradas

- Elemento
- Elemento
- Elemento

1. Elemento
2. Elemento
3. Elemento
  • Elemento
  • Elemento
  • Elemento
  1. Elemento
  2. Elemento
  3. Elemento

En lugar de - y 1. podemos utilizar * y 1) respectivamente:

* Elemento
* Elemento
    + Subelemento
        - Desagregación
* Elemento

1) Elemento
2) Elemento
3) Elemento
  • Elemento
  • Elemento
    • Subelemento
      • Desagregación
  • Elemento
  1. Elemento
  2. Elemento
  3. Elemento

Formato

Para poner el texto en cursiva utilizamos * o _ antes y después del texto.
*cursiva* o _curvisa_

*curvisa o cursiva

Para poner el texto en negrita utilizamos ** o __ antes y después del texto.
**negrita** o __negrita__

negrita o negrita

Color

<span style="color:blue">Texto *rojo cursiva* normal</span>

Texto rojo cursiva normal

Superíndices

superindice^3^ 

superindice3

Tachado

~~tachado~~

tachado

Enlaces

<http://www.rusersgroup.com>

http://www.rusersgroup.com

[R Users Group - Ecuador](www.rusersgroup.com)

R Users Group - Ecuador

[Facebook - R Users Group - Ecuador ][1]

[1]: https://www.facebook.com/Rusersgroup        "Únete a la comunidad de usuarios de R en Ecuador"

Facebook - R Users Group - Ecuador

[![RUsers](http://rusersgroup.com/img/final5x5.png)](https://www.facebook.com/Rusersgroup)

RUsers

<p>También podemos incluir código HTML directamente, como esto: <a href="https://www.facebook.com/Rusersgroup">Facebook R Users Group - Ecuador</a>.</p>

También podemos incluir código HTML directamente, como esto: Facebook R Users Group - Ecuador.

Al poder incluir HTML podemos realizar todo lo antes mencionado de esta forma, pero no es el objetivo de esta publicación, sino mas bien mostrar las potencialidades de markdown.

Símbolos

En este punto es importante la barra invertida .

Escribiéndola antes de cualquiera de los elementos a continuación, los mismos no tendrán efecto a la hora de convertirse en negritas, cursivas, links, etc.

\ barra invertida
` acento invertido
* asterisco
_ guión bajo
{} llaves
[] corchetes
() paréntesis
# numeral
+ símbolo de suma
- guión
. punto
! exclamación

Ejemplos:

\* \_ \\

* _ \

Si escribimos directamente obtenemos: *_

Líneas

---    

***

Notas a pie de página

Cada nota de pie de página se compone de dos elementos: un marcador al lado del texto que se convierte en un superíndice y de una definición que se puede colocar en una lista de notas al pie al final de documento. Ejemplo:

Esto es un texto con nota al pie [^1]
[^1]: Esto es una nota al pie de página.

Esto es un texto con nota al pie 1

Cada marcador de nota debe tener un nombre distinto. Ese nombre se utiliza para vincular la nota a la que hace referencia a las definiciones de la nota, pero no tiene ningún efecto sobre la numeración de las notas al pie. Los nombres pueden contener cualquier carácter válido que sirva para la una Identificación de un atributo HTML (es decir, que cumpla con la expresión regular [A-Za-z][-A-Za-z0-9_:.]*), no tienen porque ser necesariamente números. Ejemplo:

Esto es un texto con nota al pie [^nota1] y esta es otra nota [^nota2]
[^nota1]: Esto es una nota al pie de página.
[^nota2]: Esto es la segunda nota al pie.

Esto es un texto con nota al pie 2 y esta es otra nota 3

Identificadores de cabeceras y títulos

Los identificadores de cabecera nos permiten establecer un identificador para luego poder enlazarlas en cualquier otro lugar del texto. Generalemten utilizado para crear índices.

#### Título 1 {#tit1}
[Enlace a titulo1](#tit1)

Título 1

Enlace a titulo1

Código

Se pueden crear bloques de código para albergar extractos de código fuente de un lenguaje de programación o para reproducir literalmente cualquier tipo de texto sin que sea interpretado por markdown, para esto cada línea debe iniciar por al menos 4 espacios o 2 tabulados.

Tablas

Para crear tablas es debemos indicar cuales son los elementos de la cabecera y separar los campos con el símbolo |.

Cabecera A | Cabecera B
-- | --
Campo A1 | Campo B1
Campo A2 | Campo B2
Cabecera A Cabecera B
Campo A1 Campo B1
Campo A2 Campo B2

Por estética se pueden alinear las columnas e incluso comenzar y finalizar las filas con el símbolo |, pero no es en absoluto necesario.

| Cabecera A | Cabecera B |
| ---------- | ---------- |
| Campo A1   | Campo B1   |
| Campo A2   | Campo B2   |
Cabecera A Cabecera B
Campo A1 Campo B1
Campo A2 Campo B2

Se puede especificar la alineación de cada columna mediante la adición de dos puntos a las líneas de separación. Dos puntos a la izquierda de la línea de separación hará que la columna esté alineada a la izquierda, dos puntos a la derecha de la línea hará que la columna esté alineada a la derecha, dos puntos en ambos lados significa que la columna se alinea al centro.

| Items    | Cantidad | Precio   |
| :------- | :------: | -------: |
| Item 1   | 15       | $9,050   |
| Item 2   | 3250     | $239,99  |
Items Cantidad Precio
Item 1 15 $9,050
Item 2 3250 $239,99

Mas adelante veremos integración con otros lenguajes de programación en donde la creación de tablas se vuelve mucho mas sencillo.

Ecuaciones

En la misma linea: $A = \pi*r^{2}$ 

En la misma linea: \(A = \pi*r^{2}\)

La *función Gamma* satisface $\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N$ a través de la integral de Euler

$$
\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.
$$

La función Gamma satisface \(\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N\) a través de la integral de Euler

\[ \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. \]
Ejemplos:

$$X_i$$

\[X_i\]

$$X_{i}$$

\[X_{i}\]

$$X_{i,j}$$

\[X_{i,j}\]

$$X_i,j$$

\[X_i,j\]

$$X^2_{i,j}$$

\[X^2_{i,j}\]

$$\sqrt{b^2 - 4ac}$$

\[\sqrt{b^2 - 4ac}\]

$$\frac{4z^3}{16}$$

\[\frac{4z^3}{16}\]

$$\sum_{i=1}^{n} X^3_i$$

\[\sum_{i=1}^{n} X^3_i\]

$$\sum_{i=1}^{n}\left( \frac{X_i}{Y_i} \right)$$

\[\sum_{i=1}^{n}\left( \frac{X_i}{Y_i} \right)\]

$$\alpha, \beta,  \gamma, \Gamma$$

\[\alpha, \beta, \gamma, \Gamma\]

$$a \pm b$$

\[a \pm b\]

$$x \ge 15$$

\[x \ge 15\]

$$a_i \ge 0~~~\forall i$$

\[a_i \ge 0~~~\forall i\]

$$\int_0^{2\pi} \sin x~dx$$

\[\int_0^{2\pi} \sin x~dx\]

$$\begin{array}
{rrr}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9
\end{array}
$$

\[\begin{array} {rrr} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array} \]

$$\mathbf{X} = \left[\begin{array}
{rrr}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9
\end{array}\right]
$$

\[\mathbf{X} = \left[\begin{array} {rrr} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array}\right] \]

Citas

Para crear bloques de cita, se emplea el carácter mayor que > antes del bloque de texto.

> Esto es parte de un bloque de cita.
> Esto es parte del mismo bloque de cita.
>
> > Esto es otro bloque de cita anidado.
> > Esto es parte del bloque anidado.
>
> Esto es parte del bloque de cita de primer nivel.
Esto es una línea normal

Esto es parte de un bloque de cita. Esto es parte del mismo bloque de cita.

Esto es otro bloque de cita anidado. Esto es parte del bloque anidado.

Esto es parte del bloque de cita de primer nivel. Esto es una línea normal

Diagramas UML

![Diagrama](http://g.gravizo.com/g?
@startuml;
Object <|-- ArrayList;
Object : equals%48%49;
ArrayList : Object[] elementData;
ArrayList : size%48%49;
@enduml
)
Diagrama

Diagrama

Imágenes

<center>![R Users Group - Ecuador](http://rusersgroup.com/img/final5x5.png)</center>
R Users Group - Ecuador
![R install](https://raw.githubusercontent.com/Rgrupoec/Rgrupoec.github.io/master/img/publicaciones/2017-07-23-install_r.gif)
R install

R install

Videos

<center><iframe width="756" height="427" src="https://www.youtube.com/embed/wxKZn4Kt2WU?rel=0&showinfo=0&controls=0" frameborder="0" allowfullscreen></iframe></center>

Back to Top

Integración con R

Markdown ofrece integración con varios lenguajes de programación, dentro de estos R.

La manera más sencilla de escribir un informe rápido, mezclando un poco de R, es usar R Markdown, una variante de Markdown desarrollada por la gente de Rstudio.

Primero debe leer la página sobre Markdown.

R Markdown es una variante de Markdown basada en pandoc que tiene incrustados trozos de código R, que se utiliza con knitr para facilitar la creación de informes basados en web reproducibles.

install.packages("rmarkdown")
library(rmarkdown)

La sintaxis de Markdown tiene algunas mejoras;

  • Permite generar documentos HTML, PDF y MS Word, así como presentaciones Beamer, ioslides y Slidy.
  • Permite incluir ecuaciones de LaTeX sin procesar dentro de la reducción para la personalización avanzada de la salida de PDF.
  • Incluyendo soporte ampliado para tablas, listas de definiciones y bibliografías.
  • Permite incluir ganchos para personalizar la salida HTML y PDF (incluye CSS, encabezados y pies de página).
  • Permite definir fácilmente nuevos formatos para los requisitos de publicación personalizada.
  • Permite crear documentos interactivos de R Markdown utilizando Shiny.

Trozos de código Chunks

La clave para integración con R son los trozos de código, que se incluyen en cualquier parte del código markdown, dentro del trozo se puede incluir cualquier función o paquete de R:

`` `{r}
    X <- rnorm (100)
    Y <- 2 * X + rnorm (100)
    Y
`` `
X <- rnorm (100)
Y <- 2 * X + rnorm (100)
Y
##   [1] -1.956443950  4.531350998  1.117407659 -2.315333788 -6.917526210
##   [6]  3.318032048 -2.243153720  0.798179909 -1.996737801 -0.535673171
##  [11] -0.994654199  2.348608929  1.654710656 -0.635112335  1.261716680
##  [16]  1.888858410 -0.090495240 -1.538166144 -0.240646812 -0.012316227
##  [21]  3.955039015  3.113369751  1.005675010  3.715741289  0.338298994
##  [26]  0.172087261 -2.183585315  2.503434000 -2.610854938 -0.004026699
##  [31] -1.413458626 -4.277255341 -0.434527899  0.444968963 -1.874922980
##  [36]  4.425434810 -3.196856415 -4.279531803  4.399322303  1.624840421
##  [41] -0.660357267 -1.723909309 -0.858769065 -0.053424460 -0.387668599
##  [46] -0.827404687  2.703113249 -1.447456101 -0.793670997  0.782778979
##  [51]  5.290182932  0.289567886 -2.436677342  2.171271025  0.132920702
##  [56] -3.180236433 -0.526301582 -1.888898996  2.645846902 -2.082723485
##  [61]  2.221426127 -0.780454536  1.756617802 -4.762607798 -2.725295294
##  [66] -1.195709866 -3.956744369 -0.833171503 -0.376523833 -2.365837343
##  [71] -0.737306630 -0.272564191  2.411210504  1.478178197  1.652837287
##  [76]  0.721962884  0.010023477 -3.895120280  2.669394147 -2.187208267
##  [81] -0.512912994 -2.300812909 -0.280050279 -0.192823653 -1.337231484
##  [86]  0.763848688  5.436497023  2.656540372  0.824939986 -1.318730477
##  [91] -1.453972387 -2.716225554  2.826173053 -2.269183200  4.548179254
##  [96]  1.184796740  1.345890177  4.318497495 -2.581941264 -0.244854352

DT

DT::datatable(head(mtcars))

Plots

par(mfrow=c(1,2))
plot(pressure)
boxplot(pressure)

library(ggplot2)
library(ggExtra)
data(mpg, package="ggplot2")

theme_set(theme_bw())
mpg_select <- mpg[mpg$hwy >= 35 & mpg$cty > 27, ]
g <- ggplot(mpg, aes(cty, hwy)) + 
  geom_count() + 
  geom_smooth(method="lm", se=F)
g

library(ggdendro)
hc <- hclust(dist(USArrests), "ave")  # hierarchical clustering
ggdendrogram(hc, rotate = TRUE, size = 2)

Back to Top


  1. Esto es una nota al pie de página.

  2. Esto es una nota al pie de página.

  3. Esto es la segunda nota al pie.

Web scraping con R


Web scraping con R

Introducción

En este trabajo se discute la potencialidad de R para realizar web scraping.
Web scraping o screen scraping es el proceso de extracción automatizada de datos contenidos en un sitio web.

Este es un proceso que suele presentarse comúnmente en el entorno laboral, y se resuelve de forma manual “copiando y pegando” los datos de un directorio online o página web, pero esto no es manejable en un entorno con alta escalabilidad.

Aunque este proceso se considera algo básico y rudimentario en los entornos de programación no se puede negar que es una técnica de gran ayuda cuando nos enfrentamos a este problema.

Herramientas de web scraping

Las herramientas de web scraping conocidas también como “scrapeadores” están especialmente diseñadas para extraer información de sitios web de forma automática.

  • Import.io: extrae datos casi de cualquier web
  • Mozenda.com: el binomio de web scraping y data as a service más completo
  • Dexi.io: herramienta de web scraping para usuarios avanzados
  • Salestools.io: un scraper para equipos comerciales
  • Hunter.io: una herramienta de web scraping para capturar correos electrónicos
  • Parsehub.com: una herramienta de web scraping especializada en páginas dinámicas
  • Webhose.io: transforman los datos desestructurados de una web en dato estructurados
  • Apifier.com: el web scraper para los que dominan JavaScript
  • Diffbot.com: inteligencia artificial para la extracción de datos
  • 80legs.com: un plan gratuito para web scraping

Los usos más comunes para estas herramientas son:

  • Extracción de datos de contacto y contenidos de una web
  • Creación de análisis y canales RSS a partir de los contenidos de una página web
  • Seguimiento de la evolución de precios de distintos productos, indicadores macroeconómicos, sociales, etc.
  • Marketing de contenidos
  • Posicionamiento y control de imagen, marcas y visibilidad en redes sociales e internet.

Web scraping con R y RSelenium

Con la ayuda de R y el paquete RSelenium podemos capturar el código fuente de una página web, guardarlo en una base de datos, interactuar con la web y extraer solo información necesaria, entre otros.


Iniciamos el procedimiento instalando y cargando los paquetes Rselenium y XML.

library(RSelenium)
library(XML)

Utilizamos la función rsDriver para abrir un navegador, el cual usaremos para navegar sobre cualquier página web y posterior captura de información. La primera ejecución tarda unos minutos, ya que esta función instala el servidor Selenium y los drivers de los navegadores en nuestro equipo, una vez instalados, se abrirá un navegador por defecto chrome.

## checking Selenium Server versions:
## BEGIN: PREDOWNLOAD
## BEGIN: DOWNLOAD
## BEGIN: POSTDOWNLOAD
## checking chromedriver versions:
## BEGIN: PREDOWNLOAD
## BEGIN: DOWNLOAD
## BEGIN: POSTDOWNLOAD
## checking geckodriver versions:
## BEGIN: PREDOWNLOAD
## BEGIN: DOWNLOAD
## BEGIN: POSTDOWNLOAD
## checking phantomjs versions:
## BEGIN: PREDOWNLOAD
## BEGIN: DOWNLOAD
## BEGIN: POSTDOWNLOAD
## [1] "Connecting to remote server"
## $applicationCacheEnabled
## [1] FALSE
## 
## $rotatable
## [1] FALSE
## 
## $mobileEmulationEnabled
## [1] FALSE
## 
## $networkConnectionEnabled
## [1] FALSE
## 
## $chrome
## $chrome$chromedriverVersion
## [1] "2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8)"
## 
## $chrome$userDataDir
## [1] "C:\\Users\\crbdl\\AppData\\Local\\Temp\\scoped_dir8196_7347"
## 
## 
## $takesHeapSnapshot
## [1] TRUE
## 
## $pageLoadStrategy
## [1] "normal"
## 
## $databaseEnabled
## [1] FALSE
## 
## $handlesAlerts
## [1] TRUE
## 
## $hasTouchScreen
## [1] FALSE
## 
## $version
## [1] "60.0.3112.101"
## 
## $platform
## [1] "Windows NT"
## 
## $browserConnectionEnabled
## [1] FALSE
## 
## $nativeEvents
## [1] TRUE
## 
## $acceptSslCerts
## [1] TRUE
## 
## $locationContextEnabled
## [1] TRUE
## 
## $webStorageEnabled
## [1] TRUE
## 
## $browserName
## [1] "chrome"
## 
## $takesScreenshot
## [1] TRUE
## 
## $javascriptEnabled
## [1] TRUE
## 
## $cssSelectorsEnabled
## [1] TRUE
## 
## $setWindowRect
## [1] TRUE
## 
## $unexpectedAlertBehaviour
## [1] ""
## 
## $id
## [1] "0af78210537904cd2d3c8fcd6ae26526"

Una vez instalado el servidor ya podemos navegar sobre cualquier web, para esto utlizamos la función navigate.

Probemos con google:

remDr$navigate("http://google.com.ec")

Probemos con nuestra web oficial:

remDr$navigate("http://www.rusersgroup.com")

Manejamos al navegador con las siguientes funciones:

Atrás

remDr$goBack()

Adelante

remDr$goForward()

Obtener dirección

remDr$getCurrentUrl()
## [[1]]
## [1] "http://rusersgroup.com/"

Obtener título de la página web

remDr$getTitle()
## [[1]]
## [1] "R Users Group - Ecuador"

Maximizamos el navegador

#remDr$maxWindowSize()

Obtenemos una captura de pantalla de la página web

#remDr$screenshot(display = TRUE)

Volvamos a google y realicemos una búsqueda, para conocer con que elemento de la web debemos interactuar para realizar una búsqueda debemos localizar la sección que nos interesa dentro del código fuente, para nuestro caso, la entrada para búsquedas en google es el input “q”, si buscamos en el código fuente observamos lo siguiente:

<input class="lst lst-tbb sbibps" id="lst-ib" maxlength="2048" name="q" autocomplete="off" title="Buscar" type="text" value="" aria-label="Buscar">

Una vez detectada la sección utilizamos la función findElement utilizando como argumento el input “q” identificado de la siguiente forma:

remDr$navigate("http://www.google.com.ec")
webElem <- remDr$findElement(using = "css", "[name = 'q']")

Enviamos el texto a buscar con la función sendKeysToElement y el argumento key=“enter”

webElem$sendKeysToElement(list("R Users Group - Ecuador", key = "enter"))

o a su vez “007”

remDr$goBack()
webElem <- remDr$findElement(using = "css", "[name = 'q']")
webElem$sendKeysToElement(list("R Users Group - Ecuador", "\uE007"))

Una vez mostrados los resultados lo lógico es capturarlos, para esto nuevamente debemos buscar la secciòn que nos interesa, si observamos el código fuente vemos que cada resultado se encuentra dentro de un:

<h3 class = "r"> 

Por ejemplo el resultado:

R Users Group - Ecuador - Inicio | Facebook https://es-la.facebook.com › Lugares › Quito

Vemos que se encuentra en:

<h3 class="r"><a href="https://es-la.facebook.com/Rusersgroup/" onmousedown="return rwt(this,'','','','2','AFQjCNEOMP69o2UwXXISkHegFv5JBXIo4Q','','0ahUKEwid3cmjxuzVAhVIQyYKHYGtDMwQFggpMAE','','',event)">R Users Group - Ecuador - Inicio | Facebook</a></h3>

Una vez identificados procedemos a capturar con la función findElements y css selector de la siguiente forma:

webElems <- remDr$findElements(using = 'css selector', "h3.r")

Posterior a esto podemos aplicar la función getElementText para cada uno de los elementos capturados de la siguiente forma:

resHeaders <- unlist(lapply(webElems, function(x){x$getElementText()}))
resHeaders
##  [1] "Estimados: R User Group-Ecuador... - Miguel Alfonso Flores Sánchez ..."
##  [2] "R Users Group - Ecuador - Inicio | Facebook"                           
##  [3] "¿Quiénes somos? - R Users Group - Ecuador"                             
##  [4] "R Users Group - Ecuador"                                               
##  [5] "R Users Ecuador | LinkedIn"                                            
##  [6] "R Users Group - Ecuador | LinkedIn"                                    
##  [7] "Santiago Miño R. - Users - Datos Abiertos Ecuador"                     
##  [8] "R Users Group - Ecuador - YouTube"                                     
##  [9] "Local R User Group Directory (Revolutions) - Revolution Analytics Blog"
## [10] "RUsers Group-Ecuador (@rusersgroup) | Twitter"

Así mismo podemos obtener su url y su descripción:

webElems <- remDr$findElements(using = 'css selector', "div.s")
detalle <- unlist(lapply(webElems, function(x){x$getElementText()}))
detalle_lista <- strsplit(detalle, "\n")
url <- unlist(lapply(detalle_lista, function(x){x[1]}))
url
##  [1] "https://es-es.facebook.com/InecEcuador/posts/590279127669991"                 
##  [2] "https://es-la.facebook.com › Lugares › Quito"                                 
##  [3] "rusersgroup.com/about"                                                        
##  [4] "rusersgroup.com/"                                                             
##  [5] "https://ec.linkedin.com/in/r-users-ecuador-28510bab"                          
##  [6] "https://www.linkedin.com/company/r-users-group-ecuador - Traducir esta página"
##  [7] "catalogo.datosabiertos.gob.ec/en/user/smino"                                  
##  [8] "https://www.youtube.com/channel/UC-nYzfrbDhiA03hww0PCpXg"                     
##  [9] "blog.revolutionanalytics.com/local-r-groups.html"                             
## [10] "https://twitter.com/rusersgroup"
webElems <- remDr$findElements(using = 'css selector', "div.s")
detalle <- unlist(lapply(webElems, function(x){x$getElementText()}))
detalle_lista <- strsplit(detalle, "\n")
desc <- unlist(lapply(detalle_lista, function(x){x[2]}))
desc
##  [1] "Estimados: R User Group-Ecuador http://t.co/ui0zqS8bZK, ha compartido material sobre Modelos Lineales:..."                                                    
##  [2] "R Users Group - Ecuador, Quito. 488 Me gusta. R Users Group - Ecuador es una comunidad creada con el propósito de promover el uso del software..."            
##  [3] "R Users Group - Ecuador es una comunidad creada con el propósito de promover el uso del software estadístico R Project, además de fomentar la aplicación ..." 
##  [4] "Bienvenido a la web oficial de usuarios de R en Ecuador."                                                                                                     
##  [5] "Ecuador - Attended Escuela Politécnica Nacional"                                                                                                              
##  [6] "3 ago. 2017 - R Users Group - Ecuador es una comunidad creada con el propósito de promover el uso del software estadístico R Project, además de ..."          
##  [7] "Datasets · Organizations · Groups · About. Search Datasets. Home · Users · Santiago Miño R. Datasets · Activity Stream. Datasets. User hasn't created any ..."
##  [8] "Traducir esta página"                                                                                                                                         
##  [9] "Traducir esta página"                                                                                                                                         
## [10] "Traducir esta página"

Así mismo podemos navegar sobre varias páginas de resultados y capturarlos haciendo clicks con la función clickElement, esto y más opciones las mostraremos en futuras publicaciones.

Adicional, para cerrar el navegador debemos utilizar la función close y para cerrar el servidor selenium debemos utilizar la función stop.

remDr$close()
rD$server$stop()
## [1] TRUE

Introducción a gráficos en R

Introducción a gráficos en R


Sistemas gráficos de R

Introducción a gráficas de R

R actualmente constituye una de las principales herramientas empleada en la generación de gráficos estadísticos de alta calidad y complejidad. Presenta características muy superiores a los clásicos softwares estadísticos generalmente utilizados. Actualmente R dispone de tres tipos de sistemas (R paquetes) gráficos, entre ellos tenemos: Base, Lattice, Ggplot2.


Sistema gráficos base

Se basa en la utilización de los paquetes:

  • graphics.Funciones gráficas hist() plot(), etc.
  • grDevices.Funciones de dispositivos gráficos pdf() png() ,etc

Carácteristicas:

  • Modelo paleta de artista
  • Crear lienzo del gráfico
  • Añadir elementos utilizando las funciones lines(), points(), etc
  • Muy intuitivo
  • No posee un lenguaje gráfico estándar
  • Llamando a varias funciones (códigos extensos)
  • Una vez empezado el gráfico no es posible volver al inicio
  • Permite fijar inicialmente layouts (margenes,espacios,etc) a través de la función par ().

Ejemplo:

with(airquality, plot(Wind, Ozone, main = "Ozone vs Wind", type = "n"))
with(subset(airquality, Month <= 6), points(Wind, Ozone, col = "red", pch=16))
with(subset(airquality, Month > 6), points(Wind, Ozone, col = "blue", pch=16))
model <- lm(Ozone ~ Wind, airquality)
abline(model, lwd = 1, col= "green")
legend("topright", pch = 16, col = c("blue", "red"), legend = c("Semestre 2", "Semestre 1")) 

Facetas

par(mfrow=c(1,2))
with(subset(airquality, Month <= 6),
plot(Wind, Ozone, col = "red", pch=16, main="Semestre 1")) 
model1 <- lm(Ozone ~ Wind, subset(airquality, Month <= 6)) 
abline(model1, lwd = 1, col= "green")
with(subset(airquality, Month > 6),
plot(Wind, Ozone, col = "blue", pch=16, main="Semestre 2"))
model2 <- lm(Ozone ~ Wind, subset(airquality, Month > 6))
abline(model2, lwd = 1, col= "green")

Back to Top

Sistema gráfico Lattice

Se basa en la utilización de los paquetes:

  • Lattice. Funciones gráficas xyplot() bwplot(), etc. Grid. Para gráficos condicionados (Facetas).

Características:

  • No es muy intuitivo
  • Llamado de una sola función.
  • Layouts (margenes,espacios,etc) se fijan automáticamente

Ejemplo:

library(lattice)
airquality <- transform(airquality, Month = as.factor (Month))
graf <- xyplot(Ozone~Wind | Month, data = airquality, layout=c(5,1), panel= function(x, y){
  panel.xyplot(x, y, pch=16)
  panel.lmline(x, y, col = "green")})
print(graf)

Back to Top

Sistema gráfico ggplot2

Ggplot2 es el sistema de gràficos resultante de la combinaciòn de las carateristicas de los sistemas base y lattice. Fue desarrollado por Hardley Wickham como una implementación de la gramàtica de gràficos (Grammar of Graphics) propuesta por Leland Wilkinson.

Base + Lattice = ggplot2

ggplot2 se encuentra disponible en el repositorio CRAN, se puede instalar y cargar en el àrea de trabajo directamente ejecutando las lineas de còdigo siguientes:

#install.packages("ggplot2", dependencies=TRUE)
library(ggplot2)
g <- ggplot(mpg, aes(x=displ, y=hwy, color=drv))
g + geom_point() + geom_smooth(method="lm")

Histogramas

library(ggplot2)
g <- ggplot(mpg, aes(x=displ, fill=drv))
g + geom_histogram(binwidth=0.5, alpha = 0.8, colour="gray60")

Curvas de densidad

library(ggplot2)
g <- ggplot(mpg, aes(x=displ, fill=drv))
g + geom_density(alpha=0.8, colour="gray60") + xlim(c(0, 8))

Diagrama de Caja bigotes

library(ggplot2)
g <- ggplot(mpg, aes(x="X", y=hwy))
g + geom_boxplot(width=0.3, fill="lightseagreen", color="gray60",
outlier.colour = "red") + labs(x="")                         

Diagrama de Barras

library(ggplot2)
g <- ggplot(mpg, aes(x=fl, fill=drv))
g + geom_bar()

Diagrama de pie

library(ggplot2)
g <- ggplot(mpg, aes(x=TRUE, fill=fl)) + geom_bar(width=1)
g + coord_polar(theta = "y")

Gráficos múltiples de distribución

Los paquetes se instalan una sola vez y deben ser cargados en cada inicio de sesión.

library(ggplot2)
g <- ggplot(mpg, aes(x=drv, y=hwy, fill=drv))
g + geom_boxplot(width=0.4, colour="gray60", outlier.colour = "red")

Gráfico de linea básico

mes <- 1:300; ruido <- rnorm(300,0,1)
d <- data.frame(mes,ruido)
g <- ggplot(d, aes(x=mes, y=ruido))
g + geom_line(colour="cadetblue", size=0.3)

Gráfico de lineas múltiples

library(ggplot2)
mes <- 1:300; ruido <- rnorm(300,0,1); grupo <- factor(rep(1:3,100))
d <- data.frame(mes,ruido,grupo)
g <- ggplot(d, aes(x=mes, y=ruido, colour=grupo))
g + geom_line(size=0.3)

Generación de gráfcos ggplot

g <- ggplot(mpg, aes(x=displ, y=hwy, color=as.factor(cyl)))
g + geom_point(alpha=0.8) + geom_smooth(method="lm",colour="red") +
facet_grid(.~drv,margins = TRUE)

library(ggplot2)
g <- ggplot(mpg, aes(x=displ, y=hwy, color=drv))
g + geom_point(alpha=0.8) + geom_smooth(method="lm",colour="red") +
facet_grid(.~cyl,margins = TRUE)

library(ggplot2)
g <- ggplot(mpg, aes(x=displ, y=hwy, color=drv))
g + geom_point(alpha=0.8) + geom_smooth(method="lm",colour="red") +
facet_grid(drv ~ cyl,margins = TRUE)

Back to Top

Introducción a R


Introducción y objetivos

Introducción al uso de R como lenguaje de programación estadístico

El presente módulo introduce al participante en el manejo del software R, lo cual comprende la instalación y configuración del software necesario para el entorno de programación estadístico, la discusión de los conceptos del lenguaje de programación genéricos. Además, temas teórico-prácticos de la estadística, programación básica con el uso del script, manipulación de bases de datos, funciones y herramientas gráficas.

El objetivo del curso es actualizar-ampliar los conocimientos en la optimización de la gestión de información cuantitativa empoderando al participante de destrezas en el manejo del soft- ware R en data management, estadística descriptiva, gráficos, modelos lineales, clasificación, series de tiempo, con base a aplicaciones y casos prácticos.

  • Introducir al participante en el uso del software R como lenguaje de programación.
  • Mejorar las habilidades de gestión de información del participante.
  • Incrementar el conocimiento de modelos y su aplicación.

Visión general de R: instalación RStudio y otros

Introducción

R es un sistema para análisis estadístico y gráficos creado por Robert Gentleman y Ross Ihaka, profesores del departamento de Estadística de University of Auckland - New Zealand.

Ventajas

  • Open Source (Costo nulo) Comunidad dinámica integrada por estadísticos de renombre(R User Group Ecuador, Stackoverflow, Comunidad R Hispano, R en español,. . . )
  • Multi-plataforma: Disponible para Windows, Mac, Linux y Android.
  • Es de código abierto.
  • Facilidad de enlace con LateX y generar reportes dinámicos.
  • Amplia bibliografía en la web y libros publicados por editoriales prestigiosas (Springer, Wiley, Chapman & Hall,. . . )
  • Lenguaje intuitivo para la lectura de funciones y algoritmos.

Desventajas

  • Por ser un programa libre, no posee garantía ni un departamento de atención al cliente.
  • R no posee una interfaz amigable, las tareas se llevan a través de líneas de código, lo cual puede ser incómodo para el usuario.
  • R particularmente no es un lenguaje de programación rápida.

Cómo funciona R


Back to Top

Instalación de R, RStudio y paquetes

Instalación de R

  1. Ingresar a https://www.r-project.org/
  2. Elegir el CRAN (Comprehensive R Archive Network)
  3. Escoger versión del sistema operativo.
  4. Instalar R por primera vez.


R como una calculadora

3*8
## [1] 24
2.8/6.8
## [1] 0.4117647
sqrt(25)
## [1] 5

Además, cada operación anterior puede ser almacenada en un “objeto”

a<-3*8
b<-2.8/6.8
D<-sqrt(25)

Instalación de RStudio

  1. Ingresar a https://www.rstudio.com/
  2. Productos
  3. Escoger versión según el Sistema Operativo



Instalación de paquetes

Además de las funciones básicas, R tiene un gran número de paquetes especializados.

Los paquetes se instalan una sola vez y deben ser cargados en cada inicio de sesión.

Se utiliza la siguiente función:

install.packages("dplyr",dependencies = TRUE)

Una vez instalado, debemos cargarlo con cualquiera de estos comandos:

require(dplyr)
library("dplyr")

Para instalar un paquete desde otro repositorio:

install.packages("survey", repos="http://r-forge.r-project.org", type="source")
library(survey)

Desde github y con otra forma de cargar una función de una librería:

install.packages("githubinstall")
githubinstall::githubinstall("twitter/AnomalyDetection")

Otra forma de cargar desde github:

source("https://install-github.me/r-lib/callr")
library("callr")

Para poder ver los paquetes instalados y disponibles podemos utilizar:

library()
installed.packages()
.packages(all.available=TRUE)
available.packages() 

Para saber cuál fue el último paquete instalado utilizamos:

(.packages())

Es importante saber que funciones tiene cada paquete, para esto utilizamos:

ls("package:dplyr")

Back to Top

Data management, parte I

Estructuras de Datos

Las estructuras de datos en R se organizan por: Dimensionalidad y Homogeneidad o heterogeneidad.

R no tiene estructuras 0d (tipo escalar). Los números y strings individuales son considerados como vectores de longitud 1.

# no mostrar advertencias
options(warn = -1) 
x <- 9
x
## [1] 9

El texto luego de # es un comentario (no es interpretado por R). Para crear un objeto se utiliza el operador de asignación <-, =, ->.

y="SSh"
y
## [1] "SSh"

Vectores

La estructura de datos básica de R son los vectores, estos se dividen en Vectores atómicos y listas.

Propiedades:

Tipo: ¿Qué es?

typeof(x)
## [1] "double"

Longitud: Número de elementos.

length(x)
## [1] 1

Atributos: Características.

attributes(x)
## NULL

Vectores Atómicos

Los elementos de un vector atómico son del mismo tipo a diferencia de los elementos de una lista que pueden ser de diferente tipo. Los tipos comunes son:

  • double (numeric)
  • integer
  • character
  • logical

Función combinar

Un vector es creado mediante la función c( ) (combinar).

vec <- c(1, 2)
vec
## [1] 1 2

Tipos de Vectores Atómicos:

Vector double;

dbl_vec <- c(3.5, 2, -1)

Vector entero: Use el sufijo L para crear un vector entero;

int_vec <- c(3L, 7L, 1L)

Vector caracter: Use “ ” para crear un vector caracter;

chr_vec <- c("R",  "Users", "Group - Ecuador")

Vector lógico: Use TRUE y FALSE o T y F para crear un vector lógico.

log_vec <- c(FALSE, TRUE, F, T)

Para determinar si un vector vec es atómico utilizamos is.atomic(vec).

vec <- c(3.5, 2, -1)
is.atomic(vec)
## [1] TRUE

Para determinar el tipo de un vector vec utilizamos typeof(vec).

vec <- c("R",  "Users", "Group - Ecuador")
typeof(vec)
## [1] "character"

Para verificar si un vector vec es de un tipo en específico, se utilizan las funciones “is”:

is.character(vec)
## [1] TRUE
is.double(vec)
## [1] FALSE
is.integer(vec)
## [1] FALSE
is.logical(vec)
## [1] FALSE

Elementos de un vector atómico: La componente i de vec se obtiene mediante vec[i].

Componente 5 de vec:

vec <- c(6, 1, 3, 6, 10, 5)
vec[5]
## [1] 10

Para seleccionar varios elementos utilizamos vec[c(elementos)].

# elementos 2 y 4 
vec[c(2, 4)]
## [1] 1 6

Para omitir el elemento i de vec se utiliza vec[-i].

vec <- c(6, 1, 3, 6, 10, 5)
vec[-5]
## [1] 6 1 3 6 5

Para omitir varios elementos utilizamos vec[-c(elementos)].

# omitir los elementos 2 y 4
vec[-c(2, 4)]
## [1]  6  3 10  5

Generación de secuencias: El operador a:b genera el vector a, a+1, a+2, …, b.

1:10
##  [1]  1  2  3  4  5  6  7  8  9 10
5:-5
##  [1]  5  4  3  2  1  0 -1 -2 -3 -4 -5

La función seq( ) genera secuencias controlando: inicio, fin y salto.

seq(from = 1, to = 10, by = 0.5)
##  [1]  1.0  1.5  2.0  2.5  3.0  3.5  4.0  4.5  5.0  5.5  6.0  6.5  7.0  7.5
## [15]  8.0  8.5  9.0  9.5 10.0
seq(from = -4, to = 4, length = 5)
## [1] -4 -2  0  2  4

vec[c(TRUE, FALSE)] permite obtener determinados elementos:

# elementos 2, 4, 6
vec <- c(6, 1, 3, 6, 10, 5)
vec[c(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)]
## [1] 1 6 5

Equivalente a:

vec[c(2, 4, 6)]
## [1] 1 6 5

Operaciones con vectores

A continuación, se resumen las operaciones básicas con vectores atómicos:


Función all(x) retorna TRUE si todas las componentes de x son TRUE.

x <- c(TRUE, TRUE, TRUE)
all(x)
## [1] TRUE
y <- c(TRUE, FALSE, TRUE)
all(y)
## [1] FALSE

Función any(x) retorna TRUE si al menos una componente de x es TRUE.

x <- c(FALSE, FALSE, FALSE)
any(x)
## [1] FALSE
y <- c(FALSE, TRUE, FALSE)
any(y)
## [1] TRUE

Negación !x cambia las componentes de x de: TRUE a FALSE y de FALSE a TRUE:

x <- c(TRUE, FALSE, TRUE)
!x
## [1] FALSE  TRUE FALSE

Conjunción x & y retorna TRUE solo si las componentes de x & y son TRUE:

x <- c(TRUE, TRUE, FALSE) 
y <- c(FALSE, TRUE, TRUE)
x & y
## [1] FALSE  TRUE FALSE
x && y # conjuncion para escalares
## [1] FALSE

Disyunción x | y retorna TRUE si al menos una componente de x o y es TRUE

x <- c(TRUE, TRUE, FALSE) 
y <- c(FALSE, TRUE, TRUE) 
x | y
## [1] TRUE TRUE TRUE
x || y # disyuncion para escalares
## [1] TRUE

Dado un vector lógico x:

x <- c(TRUE, TRUE, FALSE, TRUE, FALSE)

sum(x). Cuenta el número de TRUE en x.

sum(x)
## [1] 3

mean(x). Muestra el porcentaje de TRUE en x.

mean(x)
## [1] 0.6
sum(x)/length(x)
## [1] 0.6

Test de igualdad y desigualdad

x <- c(3, 5, 2, 3, 1) 
x==3
## [1]  TRUE FALSE FALSE  TRUE FALSE
y <- x==3 # componentes iguales a 3
z <- x!=3 # componentes distintas a 3 
data.frame(x, y, z)
##   x     y     z
## 1 3  TRUE FALSE
## 2 5 FALSE  TRUE
## 3 2 FALSE  TRUE
## 4 3  TRUE FALSE
## 5 1 FALSE  TRUE
x[x!=3] # componentes de x distintas a 3
## [1] 5 2 1

Coerción: Si combinamos tipos diferentes, serán coercionados al tipo más flexible dado por la jerarquía:


Para coercionar un vector x a un determinado tipo, se utilizan las funciones “as”

as.character(x)
## [1] "3" "5" "2" "3" "1"
as.double(x)
## [1] 3 5 2 3 1
as.integer(x)
## [1] 3 5 2 3 1
as.logical(x)
## [1] TRUE TRUE TRUE TRUE TRUE
as.numeric(x) 
## [1] 3 5 2 3 1

Listas

Una lista es un vector que puede contener elementos de cualquier tipo y de distinta longitud.

Para crear una lista se utiliza la función list() en lugar de c().

lst <- list(c(1, 2), c(TRUE), c("a", "b", "c"))
lst
## [[1]]
## [1] 1 2
## 
## [[2]]
## [1] TRUE
## 
## [[3]]
## [1] "a" "b" "c"

Tests para una lista:

lst <- list(1:3, c("R",  "Users", "Group - Ecuador"), c(TRUE, FALSE), c(1.3, 4.5))
typeof(lst)
## [1] "list"
is.atomic(lst)
## [1] FALSE

Para probar si lst es una lista se utiliza:

is.list(lst)    
## [1] TRUE

Coerción de vector atómico lst a una lista

lst <- c("ssl", 4, 0.5)
as.list(lst)
## [[1]]
## [1] "ssl"
## 
## [[2]]
## [1] "4"
## 
## [[3]]
## [1] "0.5"

Coerción de lista lst a vector atómico (reglas de coerción)

lst <- list(1:3, c("R",  "Users", "Group - Ecuador"), c(TRUE, FALSE), c(1.3, 4.5))
unlist(lst)
##  [1] "1"               "2"               "3"              
##  [4] "R"               "Users"           "Group - Ecuador"
##  [7] "TRUE"            "FALSE"           "1.3"            
## [10] "4.5"

Elementos de una lista: Para acceder al elemento i de la lista se utiliza x[i]. Para acceder al objeto que contiene el elemento i se utiliza x[[i]].

lst <- list(c(1, 2), c(TRUE), c("a", "b", "c"))
lst[1]
## [[1]]
## [1] 1 2
lst[[1]]
## [1] 1 2

En una lista con nombre podemos utilizar el simbolo $ para extraer determinados elementos:

lst <- list(v=1:3, w=c("R",  "Users", "Group - Ecuador"), x=c(TRUE, FALSE), y=c(1.3, 4.5))
lst$w
## [1] "R"               "Users"           "Group - Ecuador"

Utilizar lst$w resulta equivalente a utilizar lst[[2]]

lst[[2]]
## [1] "R"               "Users"           "Group - Ecuador"

Atributos

Los objetos en R poseen varios atributos tales como: names, class, dim, etc. La función attributes(x) muestra los atributos de un objeto x.

Vector atómico:

# Vector sin el atributo names 
vec <- c(3, 6, -1, 0.5) 
attributes(vec)
## NULL
# Vector con el atributo names 
vec <- c(a=3, b=6, c=-1, d=0.5) 
attributes(vec)
## $names
## [1] "a" "b" "c" "d"

Lista:

# Lista sin el atributo names
lst <- list(1:3, c("R",  "Users", "Group - Ecuador"), c(TRUE, FALSE))
attributes(lst)
## NULL
# Lista con el atributo names
lst <- list(nomb1=1:3, nomb2=c("R",  "Users", "Group - Ecuador"), nomb3=c(TRUE,FALSE))
attributes(lst)
## $names
## [1] "nomb1" "nomb2" "nomb3"

Matrices

Una matriz es un vector con el atributo dimensión dim. El atributo dim es un vector de longitud 2: c(nrow, ncol).

mtx <- matrix (1:12,nrow=3, ncol=4, byrow=FALSE)
# se construye por columnas por default (byrow=FALSE)
mtx
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12

dim() se usa para añadir el atributo dimensión a un vector, o para hallar la dimensión de una matriz.

mtx <- 1:12
mtx 
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12
dim(mtx) <- c(3,4)
mtx 
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
mtx <- matrix (1:12, nrow=3, ncol=4, byrow=FALSE)
dim(mtx)
## [1] 3 4

Elementos de una matriz:

(mtx <- matrix (1:12, nrow=3, ncol=4, byrow=FALSE))
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
mtx[1,2] # componente 1, 2
## [1] 4
mtx[,3] # columna 3
## [1] 7 8 9
mtx[1,] # fila 1
## [1]  1  4  7 10
mtx[,c(2,4)] # columnas 2 y 4
##      [,1] [,2]
## [1,]    4   10
## [2,]    5   11
## [3,]    6   12
mtx[c(1,3),] # filas 1 y 3
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    3    6    9   12
mtx[,c(FALSE, TRUE, TRUE, FALSE)] # columnas 2 y 4
##      [,1] [,2]
## [1,]    4    7
## [2,]    5    8
## [3,]    6    9
mtx[c(TRUE, FALSE, TRUE),] # filas 1 y 3
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    3    6    9   12

Factores

Es la estructura de datos utilizada para almacenar variables categóricas. ¿Por qué utilizar factores?

Un vector c(Femenino, Masculino) (factor) presenta mayor información que un vector c(1, 2).

Un vector character c(“Femenino”, “Masculino”) no pueden ser incluido en modelos de regresión, un factor c(Femenino, Masculino) si.

Un factor se crea mediante la función: factor()

Si se dispone de un vector integer:

vec <- c(1, 2, 2, 1, 2, 1, 2)
vec
## [1] 1 2 2 1 2 1 2

La función factor asigna labels a los levels (o categorías) de la variable. Los levels del vector vec son los valores 1, 2.

# Creación de un factor
fac <- factor(vec, levels=c(1,2), labels = c("Femenino", "Masculino"))
fac
## [1] Femenino  Masculino Masculino Femenino  Masculino Femenino  Masculino
## Levels: Femenino Masculino

Si se dispone de un vector character:

# Creación de un factor
vec <- c("Femenino","Masculino","Masculino","Femenino","Masculino", "Femenino","Masculino")
vec
## [1] "Femenino"  "Masculino" "Masculino" "Femenino"  "Masculino" "Femenino" 
## [7] "Masculino"

La función factor asigna labels a los levels (o categorías) de la variable. En este caso los levels del vector vec son los valores “Femenino”, “Masculino”.

# Creación de un factor
# por defecto labels = levels
fac <- factor(vec, levels= c("Femenino", "Masculino"), labels=c("FEM", "MASC"))
fac
## [1] FEM  MASC MASC FEM  MASC FEM  MASC
## Levels: FEM MASC

Para obtener los atributos de un factor utilizamos attributes().

vec <- c(1, 2, 2, 1, 2, 1, 2)
fac <- factor(vec, levels=c(1,2), labels = c("Femenino", "Masculino"))
# Atributos de un factor 
attributes(fac)
## $levels
## [1] "Femenino"  "Masculino"
## 
## $class
## [1] "factor"

Para considerar el vector entero utilizamos unclass().

# eliminación del atributo class 
unclass(fac)
## [1] 1 2 2 1 2 1 2
## attr(,"levels")
## [1] "Femenino"  "Masculino"

Para realizar conteos por categoría, se utiliza la función table().

fac <- factor(vec, levels=c(1,2), labels = c("Femenino", "Masculino"))
# frecuencias table(fac)
# porcentaje 
prop.table(table(fac))
## fac
##  Femenino Masculino 
## 0.4285714 0.5714286

Data Frame

Es una lista en la cual todos los elementos tienen la misma longitud. A diferencia de las matrices, pueden almacenar vectores atómicos de cualquier tipo. Presenta varios atributos adicionales class, rownames, names. Es la estructura de datos más utilizada para almacenar data tabulada.

Para crear un data frame se utiliza la función data.frame(). Con los siguientes vectores atómicos:

dbl_vec <- c(1, 2, 3) 
chr_vec <- c("R", "S", "T") 
log_vec <- c(TRUE, FALSE, TRUE)

Creamos el data frame df:

df <- data.frame(dbl_vec, chr_vec, log_vec)
df
##   dbl_vec chr_vec log_vec
## 1       1       R    TRUE
## 2       2       S   FALSE
## 3       3       T    TRUE

Un data frame es una lista:

typeof(df) # Tipo de un data frame
## [1] "list"

Su clase es data.frame:

class(df)
## [1] "data.frame"

Atributos de un data frame:

attributes(df)
## $names
## [1] "dbl_vec" "chr_vec" "log_vec"
## 
## $row.names
## [1] 1 2 3
## 
## $class
## [1] "data.frame"

Nombres de las columnas de df:

names(df)
## [1] "dbl_vec" "chr_vec" "log_vec"

Nombres de las filas de df:

rownames(df)
## [1] "1" "2" "3"

Dimensión: Filas y columnas

dim(df)
## [1] 3 3

Número de filas y columnas

nrow(df)
## [1] 3

Elementos de un data frame:

Mediante df[i, j] se obtiene la componente i, j del data frame.

nomb <- c("John", "Paul", "George", "Ringo")
nac <- c(1940, 1941, 1943, 1940)
instr <- c("guitar", "bass", "guitar", "drums")

df <- data.frame(nomb, nac, instr)
df[2, c(2,3)]
##    nac instr
## 2 1941  bass
print(df)
##     nomb  nac  instr
## 1   John 1940 guitar
## 2   Paul 1941   bass
## 3 George 1943 guitar
## 4  Ringo 1940  drums
df[2, 2] # componente 2, 2
## [1] 1941
df[3, 1] # componente 3, 1
## [1] George
## Levels: George John Paul Ringo
df[c(1, 4), ] # filas 1, 4
##    nomb  nac  instr
## 1  John 1940 guitar
## 4 Ringo 1940  drums

Se pueden seleccionar ciertas filas mediante TRUE y FALSE.

df[c(TRUE, TRUE, FALSE, TRUE), ] # equivalente a df[c(1, 2, 4), ]
##    nomb  nac  instr
## 1  John 1940 guitar
## 2  Paul 1941   bass
## 4 Ringo 1940  drums

Importante: Reciclado:

df[c(TRUE, FALSE), ] # equivalente a df[c(1, 3), ]
##     nomb  nac  instr
## 1   John 1940 guitar
## 3 George 1943 guitar

Importante: Filtrado o subsetting:

df[ , 3]=="guitar" # columna 3 de df igual a "guitar"
## [1]  TRUE FALSE  TRUE FALSE
f_guitar <- df[ , 3]=="guitar"

Filas donde la columna 3 es igual a “guitar”

df[f_guitar, ]
##     nomb  nac  instr
## 1   John 1940 guitar
## 3 George 1943 guitar
df[ , c(1, 3)] # columnas 1, 3
##     nomb  instr
## 1   John guitar
## 2   Paul   bass
## 3 George guitar
## 4  Ringo  drums

Columna de nombre “nac”

df[ , "nac"] # equivalente a df[ , 2]
## [1] 1940 1941 1943 1940

Columnas de nombres “nomb y nac”

df[ , c("nomb", "nac")] # equivalente a df[ , c(1, 2)]
##     nomb  nac
## 1   John 1940
## 2   Paul 1941
## 3 George 1943
## 4  Ringo 1940

Se pueden seleccionar ciertas columnas mediante TRUE y FALSE:

df[ , c(TRUE, FALSE, TRUE)] # equivalente a df[ , c(1, 3)]
##     nomb  instr
## 1   John guitar
## 2   Paul   bass
## 3 George guitar
## 4  Ringo  drums

Importante: Reciclado

df[ , c(TRUE, FALSE)] # equivalente a df[ , c(1, 3)]
##     nomb  instr
## 1   John guitar
## 2   Paul   bass
## 3 George guitar
## 4  Ringo  drums

R Data Frames

R posee varios data frames en sus bases de datos internas, por ejemplo: mtcars

data(mtcars)

Visualización:

View(mtcars)
# n primeras filas 
head(mtcars,n = 2)
##               mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
## Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
# n últimas filas 
tail(mtcars,n = 2)
##                mpg cyl disp  hp drat   wt qsec vs am gear carb
## Maserati Bora 15.0   8  301 335 3.54 3.57 14.6  0  1    5    8
## Volvo 142E    21.4   4  121 109 4.11 2.78 18.6  1  1    4    2

Atributos del data frame:

attributes(mtcars)
## $names
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
## 
## $row.names
##  [1] "Mazda RX4"           "Mazda RX4 Wag"       "Datsun 710"         
##  [4] "Hornet 4 Drive"      "Hornet Sportabout"   "Valiant"            
##  [7] "Duster 360"          "Merc 240D"           "Merc 230"           
## [10] "Merc 280"            "Merc 280C"           "Merc 450SE"         
## [13] "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood" 
## [16] "Lincoln Continental" "Chrysler Imperial"   "Fiat 128"           
## [19] "Honda Civic"         "Toyota Corolla"      "Toyota Corona"      
## [22] "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"         
## [25] "Pontiac Firebird"    "Fiat X1-9"           "Porsche 914-2"      
## [28] "Lotus Europa"        "Ford Pantera L"      "Ferrari Dino"       
## [31] "Maserati Bora"       "Volvo 142E"         
## 
## $class
## [1] "data.frame"

Nombres de las columnas:

names(mtcars)   
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
colnames(mtcars)                        
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"

Nombres de las filas

rownames(mtcars)
##  [1] "Mazda RX4"           "Mazda RX4 Wag"       "Datsun 710"         
##  [4] "Hornet 4 Drive"      "Hornet Sportabout"   "Valiant"            
##  [7] "Duster 360"          "Merc 240D"           "Merc 230"           
## [10] "Merc 280"            "Merc 280C"           "Merc 450SE"         
## [13] "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood" 
## [16] "Lincoln Continental" "Chrysler Imperial"   "Fiat 128"           
## [19] "Honda Civic"         "Toyota Corolla"      "Toyota Corona"      
## [22] "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"         
## [25] "Pontiac Firebird"    "Fiat X1-9"           "Porsche 914-2"      
## [28] "Lotus Europa"        "Ford Pantera L"      "Ferrari Dino"       
## [31] "Maserati Bora"       "Volvo 142E"

Dimensiones en un data frame:

# Dimensión 
dim(mtcars)
## [1] 32 11
# Número columnas 
ncol(mtcars)
## [1] 11
# Número filas 
nrow(mtcars)
## [1] 32

Función structure

La función str() (structure) presenta una descripción compacta de la estructura de datos. Usar View() es costoso computacionalmente.

str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

Missing Values

Los valores perdidos en R se denotan por NA, NaN. NA Not Available. Dato perdido.

x <- c(NA, 3.2, NA, 5, NA)
x
## [1]  NA 3.2  NA 5.0  NA

NaN Not a Number. Resultado de una indeterminación:

y <- c(-1, 0/0, 0.8, 5, Inf*0)
y
## [1] -1.0  NaN  0.8  5.0  NaN

Inf representa infinito.

is.na(x) retorna TRUE para elementos NA de un vector atómico o lista.

x <- c(0, 3.2, NA, 5, NA)
is.na(x)
## [1] FALSE FALSE  TRUE FALSE  TRUE

is.nan(x) retorna TRUE para elementos NaN de un vector atómico.

y <- c(-1, 0/0, 5, Inf*0)
is.nan(y)
## [1] FALSE  TRUE FALSE  TRUE

Importación y Exportación de datos

Lectura de datos

R puede acceder a información almacenada en distintos formatos:

Archivos de excel .xls, .xlsx, .csv; Archivos de texto plano .txt; Archivos de spss .sav; Archivos de la web; Archivos de bases de datos, etc.

Directorio de trabajo

Working directory (wd). Es la dirección donde se almacenan, leen y escriben los archivos utilizados y generados mediante R. getwd() permite obtener el wd actual:

getwd()
## [1] "C:/Users/crbdl/Desktop"

setwd() permite setear un nuevo wd, por ejemplo:

setwd("C:/Documentos/R_users_group")

list.files() enlista los nombres de los archivos en el wd actual. El parámetro pattern se usa para enlistar los nombres de los archivos que contienen un determinado patrón.

list.files(pattern = ".R")

file.exists() verifica si existe una carpeta con un determinado nombre en el wd.

# Verifica si existe o no una carpeta con nombre "r_users"
file.exists("r_users")
## [1] FALSE

dir.create() permite crear nuevas carpetas en el wd.

# Crea una nueva carpeta con nombre "files" 
dir.create("files")

R sobreescribe una carpeta sobre otra, de ahí la importancia de utilizar previamente file.exists().

Back to Top

¿Cómo leer archivos en R?

Lectura de archivos .txt

Se requiere leer un archivo en formato txt: archivo.txt. Se utiliza la función read.table()

data_txt <- read.table(file = "archivo.txt",sep = "\t", dec = ",", header = TRUE)
str(data_txt)

Parámetros:

file: nombre del archivo (incluida extensión); sep: caracter utilizado para separar columnas (variables); dec: caracter utilizado para decimales; header: TRUE, si la primera fila contiene los nombres de las columnas.

str() describe la estructura de datos.

Por defecto R coerciona las variables categóricas a factor. El parametro stringsAsFactors=FALSE evita esta coerción.

data_txt <- read.table(file = "archivo.txt",sep = "\t", dec = ",", header = TRUE, stringsAsFactors = FALSE)

Lectura de archivos .csv

Se requiere leer un archivo en formato csv: archivo.csv, se utiliza las función read.csv que presenta por defecto los argumentos: sep = “,”, dec = “.”, , header = TRUE

data_csv <- read.csv(file = "archivo.csv")

read.csv2(): Se debe especificar los argumentos: sep, dec, header

data_csv2 <- read.csv2(file = "archivo.csv",sep = ",", dec = ".", header = TRUE)

Lectura de archivos .xls, .xlsx

Se requiere leer un archivo en formato xls o xlsx: archivo.xlsx. Se utiliza la función read_excel() del paquete readxl

install.packages("readxl", dependencies = TRUE)
library(readxl)
ls("package:readxl")

Lectura del archivo archivo.xlsx:

data_xlsx <- read_excel("archivo.xlsx",sheet = "datos",col_names = TRUE, na="")
read.table("clipboard",sep = "\t",header = FALSE)

Parámetros:

sheet: Nombre de la hoja que contiene la data (recibe también el número de hoja); col_names: TRUE si la primera fila contiene los nombres de las columnas; na: los caracter que se coerciona a NA.

Lectura de archivos .sav

Se requiere leer archivos desde spss, es decir en formato .sav: archivo.sav. Se utiliza la función read.spss() del paquete foreign.

install.packages("foreign", dependencies = TRUE)
library(foreign)
ls("package:foreign")
data_sav <- read.spss(file="archivo.sav", use.value.labels = TRUE, to.data.frame = TRUE)

Parámetros:

file: nombre del archivo (incluida extensión); use.value.labels: TRUE, si se consideran las etiquetas de las variables; to.data.frame: TRUE, para coercionar el archivo leído a data frame.

Back to Top

Funciones

Introducción

Una función es un conjunto de instrucciones, que a partir de uno o más datos de entrada, permiten generar y retornar un detrminado resultado.

¿Porqué construir funciones?

Practicidad: Permiten ejecutar un conjunto de instrucciones en una sola línea de código. Ejemplo: La función sort , las instrucciones necesarias para ordenar un vector.

x <- c(3, 1, 6, 2)
x
## [1] 3 1 6 2
sort (x)
## [1] 1 2 3 6

Generalización: Permiten diseñar códigos para casos determinados y ajustarlos a casos generales.

Ejemplo: Hallar la media de 3 y 4

(3 + 4) / 2
## [1] 3.5

Para hallar el promedio de varios pares de números, creamos la función promedio.

promedio <- function(a, b) {
prom <- (a + b) / 2 
return (prom)
}

Estructura de una función

El comando function() tiene como tarea crear funciones a partir de ciertos argumentos que son proporcionados por el usuario.

No existe un límite en la cantidad de argumentos que una función puede recibir.

promedio_pond <- function(a, b, peso1, peso2) {
prom <- peso1*a + peso2*b 
return (prom)
}

Ejemplos:

promedio_pond(a=    1, b    = 5, peso1 = 0.8, peso2 =   0.2)
## [1] 1.8

Argumentos por default

Existen ocasiones que no se requieren ingresar ciertos argumentos para que la función pueda ejecutarse.

Estos valores por default deben colocarse en la función:

promedio_pond <- function(a, b, peso1 = 0.5, peso2 = 0.5) {
prom <- peso1*a + peso2*b 
return (prom)
}
promedio_pond(a = 1, b = 5)
## [1] 3

Lexical Scoping

Variable libre: Una variable en una función se dice libre si no ha sido definida o no es un argumento.

El lexical Scoping permite entender cómo R asocia un valor a una variable libre (crear un objeto).

f <- function(x, y) {
return(x^2 + y / z)
}

Argumentos: x, y. Variables libres: z.

f(x = 3, y = 6)
## [1] Inf  15  15 Inf  15

Considere la siguiente función:

z <- 10
f <- function(x) {
z <- 2
z^2 + g(x)
}
g <- function(x) {
x*z
}

Cuál es el valor de f(x = 3) ?

f(x = 3)
## [1] 34

Back to Top

Estructuras de Control


Son herramientas que permiten manejar de una forma mucho más estructurada el flujo de ejecución de un código. Las estructuras de control se clasifican en:

Condicionales: if, else (e ifelse). Loops o bucles: for, while.

Sentencia if

La sentencia if realiza una tarea para un determinado caso.

CONDICION: Vector lógico 1d TRUE/FALSE . Si condicion es TRUE se ejecuta la tarea. Forma de declarar la sentencia if:

x <- 2
if(x > 0) {
x <- x + 1
}
x 
## [1] 3

Sentencia else

La sentencia else trabaja conjuntamente con la sentencia if


Si la condición es TRUE se ejecuta la Tarea 1, caso contrario se ejecuta la Tarea 2.

Sentencia if else

Forma de declarar la sentencia if else :

x <- -1
if (x >= 0) {
print("El número es positivo")
} else {
print("El número es negativo")
}
## [1] "El número es negativo"

Sentencia for

La sentencia for permite repetir una acción un número determinado de veces.

Forma de declarar la sentencia for:

Ejemplo: Suma de filas/columnas: m: matriz de 4x3 de Poisson

m <- matrix(data = rpois(n = 12, lambda = 8), nrow = 4, ncol = 3)
m
##      [,1] [,2] [,3]
## [1,]    7    8    9
## [2,]   10   14    8
## [3,]    8   10    7
## [4,]    6   11    6
col_sumas <- numeric(ncol(m))
for (i in 1:4){
col_sumas[i] <- sum(m[i,])
}
col_sumas                                                                 
## [1] 24 32 25 23

Funciones loop tipo ”apply”

apply

Apply se utiliza para evaluar una función (a menudo anónima) sobre los márgenes de una matriz. Se utiliza con mayor frecuencia para aplicar una función a las filas o columnas de una matriz. Se puede usar con matrices generales, p. Tomando el promedio de una matriz de matrices no es realmente más rápido que escribir un bucle, pero funciona en una línea!

str(apply)
## function (X, MARGIN, FUN, ...)

X es una matriz

MARGIN es un vector entero que indica qué márgenes deben ser retenidos“. FUN es una función a ser aplicada para que otros argumentos sean pasados a FUN

x <- matrix(rnorm(200), 20, 10)
apply(x, 2, mean)
##  [1]  0.375680998 -0.386917588 -0.337469042 -0.253210969 -0.095369786
##  [6]  0.006149434 -0.262256608 -0.151185842  0.030029833 -0.262586216

col/row Sumas y Medias

Para las sumas y los medias de las dimensiones de la matriz, tenemos algunos atajos:

rowSums = apply(x,  1, sum)
rowMeans = apply(x,  1, mean)
colSums = apply(x,  2, sum)
colMeans = apply(x,  2, mean)

Las funciones de acceso directo son mucho más rápidas, pero no te darás cuenta a menos que estés usando una matriz grande.

Otras Formas de Aplicar

Quantiles de las filas de una matriz.

x <- matrix(rnorm(200), 20, 10)
apply(x, 1, quantile, probs = c(0.25, 0.75))
##           [,1]      [,2]       [,3]       [,4]       [,5]       [,6]
## 25% -0.9986528 -1.329281 -0.6930205 -0.4490333 -0.1848993 -0.5006163
## 75%  0.1255915  0.359086  0.8898816  0.6627382  0.7923025  0.3157985
##           [,7]       [,8]       [,9]      [,10]      [,11]      [,12]
## 25% -0.4413362 -1.0880216 -0.3640341 -0.8919106 -0.3917338 -1.0468530
## 75%  0.4240068  0.7934426  0.3140949  0.7787425  0.8882287  0.6145108
##          [,13]      [,14]      [,15]      [,16]      [,17]      [,18]
## 25% -1.0982383 -0.5216335 -0.8433666 -0.3522312 -0.9730085 -0.6937552
## 75% -0.1730996  0.4500281  0.7283369  0.6748745  0.3634782  0.9827490
##          [,19]      [,20]
## 25% -0.7897723 0.02118837
## 75%  0.4957886 1.21741085

Matriz media en una matriz

a <- array(rnorm(2 * 2 * 10), c(2, 2, 10))
apply(a, c(1, 2), mean)
##           [,1]        [,2]
## [1,] 0.2332499 -0.07410178
## [2,] 0.2385339  0.49606679

tapply

tapply se utiliza para aplicar una función sobre subconjuntos de un vector.

str(tapply)
## function (X, INDEX, FUN = NULL, ..., simplify = TRUE)

X es un vector INDICE es un factor o una lista de factores (o bien son coaccionados a factores) FUN es una función a ser aplicada contiene otros argumentos para ser evaluados FUN simplificar, ¿debemos simplificar el resultado?

Tomar grupos significa:

x <- c(rnorm(10), runif(10), rnorm(10, 1))
f <- gl(3, 10)
f   
##  [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3
## Levels: 1 2 3

Tomar medias de grupos sin simplificación.

tapply(x, f, mean, simplify = FALSE)
## $`1`
## [1] -0.4014109
## 
## $`2`
## [1] 0.5845753
## 
## $`3`
## [1] 0.7220379

Encuentra rangos de grupo.

tapply(x, f, range)
## $`1`
## [1] -2.1083360  0.9654397
## 
## $`2`
## [1] 0.3911844 0.8530016
## 
## $`3`
## [1] -0.1659212  3.1330298

lapply y sapply

La escritura de while es útil cuando se programa pero no es especialmente fácil cuando se trabaja interactivamente en la línea de comandos. Hay algunas funciones que implementan bucles para facilitar la vida.

Lapply: Bucle sobre una lista y evaluar una función en cada elemento Sapply: Lo mismo que lapply pero intenta simplificar el resultado Apply: Aplicar una función sobre los márgenes de una matriz Tapply: Aplicar una función sobre subconjuntos de un vector Mapply: Versión multivariable de lapply

También es útil una división de función auxiliar, particularmente en conjunción con lapply.

lapply

Lapply toma tres argumentos: (1) una lista X; (2) una función (o el nombre de una función) FUN; (3) otros argumentos a través de su argumento. Si X no es una lista, será coaccionado a una lista usando as.list.

lapply
## function (X, FUN, ...) 
## {
##     FUN <- match.fun(FUN)
##     if (!is.vector(X) || is.object(X)) 
##         X <- as.list(X)
##     .Internal(lapply(X, FUN))
## }
## <bytecode: 0x0000000012af6640>
## <environment: namespace:base>

El bucle real se realiza internamente en código C.

Lapply siempre devuelve una lista, independientemente de la clase de la entrada.

x <- list(a = 1:4, b = rnorm(10), c = rnorm(20, 1), d = rnorm(100, 5))
lapply(x, mean)
## $a
## [1] 2.5
## 
## $b
## [1] 0.6970291
## 
## $c
## [1] 1.138907
## 
## $d
## [1] 5.188079
x <- 1:4 
lapply(x, runif)
## [[1]]
## [1] 0.3899072
## 
## [[2]]
## [1] 0.6053326 0.2631529
## 
## [[3]]
## [1] 0.7674535 0.2481148 0.6048053
## 
## [[4]]
## [1] 0.9630127 0.6112869 0.3498528 0.5991059
x <- 1:4
lapply(x, runif, min = 0, max = 10)
## [[1]]
## [1] 5.099684
## 
## [[2]]
## [1] 6.049304 5.235927
## 
## [[3]]
## [1] 5.605220 9.718606 2.388543
## 
## [[4]]
## [1] 3.347105 6.844083 6.963573 1.313079

Lapply permite hacer un uso intensivo de funciones anónimas.

x <- list(a = matrix(1:4, 2, 2), b = matrix(1:6, 3, 2))
x
## $a
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## $b
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6

Una función anónima para extraer la primera columna de cada matriz.

lapply(x, function(elt) elt[,1])
## $a
## [1] 1 2
## 
## $b
## [1] 1 2 3

Sapply

Sapply tratará de simplificar el resultado de lapply si es posible.

Si el resultado es una lista donde cada elemento es la longitud 1, entonces se devuelve un vector

Si el resultado es una lista donde cada elemento es un vector de la misma longitud (>1), se devuelve una matriz.

Y no puede calcular, se devuelve una lista

x <- list(a = 1:4, b = rnorm(10), c = rnorm(20, 1), d = rnorm(100, 5))
lapply(x, mean)
## $a
## [1] 2.5
## 
## $b
## [1] -0.1764945
## 
## $c
## [1] 0.8521396
## 
## $d
## [1] 5.056278
sapply(x, mean)
##          a          b          c          d 
##  2.5000000 -0.1764945  0.8521396  5.0562784

mapply

Mapply es una aplicación multivariable de tipos que aplica una función en paralelo sobre un conjunto de argumentos.

str(mapply)
## function (FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)

FUN es una función para aplicar … contiene argumentos para aplicar MoreArgs es una lista de otros argumentos para FUN. SIMPLIFY indica si el resultado debe ser simplificado

El siguiente listado es tedioso digitar: list(rep(1, 4), rep(2, 3), rep(3, 2), rep(4, 1)) Por lo cual se puede hacer:

mapply(rep, 1:4, 4:1)
## [[1]]
## [1] 1 1 1 1
## 
## [[2]]
## [1] 2 2 2
## 
## [[3]]
## [1] 3 3
## 
## [[4]]
## [1] 4

Vectorizando una Función

noise <- function(n, mean, sd) {
rnorm(n, mean, sd)
}

Vectorización instantánea

mapply(noise, 1:5, 1:5, 2)
## [[1]]
## [1] 1.849743
## 
## [[2]]
## [1] 2.399712 4.371152
## 
## [[3]]
## [1] 4.999238 5.639152 1.006731
## 
## [[4]]
## [1] 6.835012 4.930839 3.930951 3.894547
## 
## [[5]]
## [1] 4.861750 5.494002 5.516326 4.588543 7.085203

Lo cual es lo mismo que:

list(noise(1, 1, 2), noise(2, 2, 2),    noise(3, 3, 2), noise(4, 4, 2), noise(5, 5, 2))
## [[1]]
## [1] -0.5319374
## 
## [[2]]
## [1]  5.017320 -2.580596
## 
## [[3]]
## [1] 2.426552 2.616396 2.785114
## 
## [[4]]
## [1] 3.581864 6.604843 6.517391 3.691458
## 
## [[5]]
## [1] 6.797958 8.984205 3.492458 4.071135 3.837592

split

split toma un vector u otros objetos y lo divide en grupos determinados por un factor o una lista de factores.

str(split)
## function (x, f, drop = FALSE, ...)

X es un vector (o lista) o un marco de datos F es un factor (o coaccionado a uno) o una lista de factores Drop indica si los niveles de factores vacíos deben ser eliminados

x <- c(rnorm(10), runif(10), rnorm(10, 1))
f <- gl(3, 10)
split(x, f)
## $`1`
##  [1]  0.18546082  0.70710539 -0.40715155 -1.07120272  0.22565579
##  [6]  0.09808071  0.28057701 -0.25702616 -0.57604646  1.28589004
## 
## $`2`
##  [1] 0.8887993 0.9725940 0.3833292 0.1011196 0.2321548 0.3389057 0.9597877
##  [8] 0.9047762 0.8589763 0.6351879
## 
## $`3`
##  [1]  0.2020942  0.8242144  0.8620720  2.4277311 -0.9836047  1.2817231
##  [7]  1.7216647  2.8483862 -0.2665849  1.6397124

Una función común se divide seguido de un lapply.

lapply(split(x, f), mean)
## $`1`
## [1] 0.04713429
## 
## $`2`
## [1] 0.6275631
## 
## $`3`
## [1] 1.055741

División de un data frame

library(datasets)
head(airquality)
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 5    NA      NA 14.3   56     5   5
## 6    28      NA 14.9   66     5   6
s <- split(airquality, airquality$Month)
lapply(s, function(x) colMeans(x[, c("Ozone", "Solar.R", "Wind")]))
## $`5`
##    Ozone  Solar.R     Wind 
##       NA       NA 11.62258 
## 
## $`6`
##     Ozone   Solar.R      Wind 
##        NA 190.16667  10.26667 
## 
## $`7`
##      Ozone    Solar.R       Wind 
##         NA 216.483871   8.941935 
## 
## $`8`
##    Ozone  Solar.R     Wind 
##       NA       NA 8.793548 
## 
## $`9`
##    Ozone  Solar.R     Wind 
##       NA 167.4333  10.1800
sapply(s, function(x) colMeans(x[, c("Ozone", "Solar.R", "Wind")]))
##                5         6          7        8        9
## Ozone         NA        NA         NA       NA       NA
## Solar.R       NA 190.16667 216.483871       NA 167.4333
## Wind    11.62258  10.26667   8.941935 8.793548  10.1800

División en más de un nivel

x <- rnorm(10) 
f1 <- gl(2, 5) 
f2 <- gl(5, 2)
f1
##  [1] 1 1 1 1 1 2 2 2 2 2
## Levels: 1 2

Interacciones pueden crear niveles vacios:

str(split(x, list(f1, f2)))
## List of 10
##  $ 1.1: num [1:2] 0.0735 0.0123
##  $ 2.1: num(0) 
##  $ 1.2: num [1:2] 1.508 -0.774
##  $ 2.2: num(0) 
##  $ 1.3: num -0.848
##  $ 2.3: num -0.671
##  $ 1.4: num(0) 
##  $ 2.4: num [1:2] 0.782 0.765
##  $ 1.5: num(0) 
##  $ 2.5: num [1:2] -1.18 -0.383

Se pueden eliminar niveles vacíos:

str(split(x, list(f1, f2), drop = TRUE))
## List of 6
##  $ 1.1: num [1:2] 0.0735 0.0123
##  $ 1.2: num [1:2] 1.508 -0.774
##  $ 1.3: num -0.848
##  $ 2.3: num -0.671
##  $ 2.4: num [1:2] 0.782 0.765
##  $ 2.5: num [1:2] -1.18 -0.383

Back to Top

Primer Meetup RLadies-Quito

RLadies-Quito

R Users Group - Ecuador te invita a participar de este encuentro.

¡Bienvenidas al primer meet-up de R-Ladies Quito!

En este meet-up, haremos una introducción de R, una introducción de nosotras y una mesa redonda para conocernos y hacer un poco de networking.

Si conoces a otras mujeres interesadas en R que se apunten o vengan como invitadas :). Hay espacio para todas!!!


La agenda será la siguiente:

• 17:30pm: comienzo del evento.

• 17:45pm-18:00pm: introducción de R y R-Ladies.

• 18:00pm: mesa redonda

• 18:30 un poco de comer/beber para conocernos todas.

Lugar: ¡Tenemos un sitio para el evento! genial!!! será en CONQUITO, en la Av. Maldonado Oe1-172 y Carlos María de la Torre frente a la parada Jefferson Pérez del Trole.

FECHA/HORA: 8 de de agosto a las 17:30.

Las esperamos!!!

Cloud Computing - R en la nube!

Te mostramos varias opciones para usar la consola de R en línea como un primer acercamiento al Cloud Computing.

Pero ¿Qué es cloud computing?

Cloud computing puede definirse como un modelo de computación en el cual el hardware y software necesarios para prestar un servicio residen en centros de datos accesibles desde cualquier punto de Internet. Así, los datos y los recursos pasan de estar en nuestros ordenadores a estar “en la nube”.

Siendo más específicos, de acuerdo al NIST (National Institute of Standards and Technology, de la Oficina de Comercio de Estados Unidos), para hablar de cloud computing han de cumplirse cinco características fundamentales:

  • Capacidad para incrementar y reducir rápidamente los recursos
  • Pago por uso realizado
  • Posibilidad de utilizar los servicios cloud sin interacción humana con el proveedor
  • Acceso desde cualquier parte a través de Internet
  • Compartir recursos físicos y virtuales del proveedor de acuerdo a la demanda del cliente

Las modalidades más difundidas de cloud son:

Software como servicio (SaaS, Software As A Service) Consiste en la distribución de software donde una empresa proporciona el mantenimiento, soporte y operación que usará el cliente durante el tiempo que haya contratado el servicio. Ejemplos: GMail, Google Docs, Amazon S3, etc.

Plataforma como servicio (PaaS, Platform As A Service) Su principal uso se centra en ofrecer una solución completa para la construcción y puesta en marcha de aplicaciones y servicios Web que estarán completamente disponibles a través de Internet. Algunos ejemplos: Google App Engine, Amazon SimpleDB, etc.

Infraestructura como servicio (IaaS, Infrastructure As A Service) Proporciona al cliente una infraestructura de computación como un servicio, usando principalmente la virtualización. El cliente compra recursos a un proveedor externo, para hosting, capacidad de cómputo, mantenimiento y gestión de redes, etc. Ejemplos: Amazon EC2, Azure de Microsoft, etc.

Sin embargo hemos de tener en cuenta que estamos todavía en las etapas iniciales del desarrollo del cloud y que cada día están surgiendo nuevas modalidades de servicios, que extienden cada vez más el ámbito del cloud hasta llegar a zonas difusas donde realmente no se les podría denominar cloud computing de acuerdo a los criterios del NIST.

Se trata de un entorno muy dinámico, en el que no se sabe cuáles serán los servicios que se van a consolidar y tener éxito en el mercado. Confluyen en él grandes proveedores (empresas de Internet, fabricantes de software y hardware, consultoras, operadores de telecomunicaciones), que están haciendo enormes inversiones, con todo tipo de pequeños y medianos desarrolladores de aplicaciones.

El cloud es una tecnología que hay que tener en cuenta, ya que existe un consenso generalizado en el sector de que se trata de un nuevo paradigma que está cambiando la forma en que utilizamos y gestionamos las TI y que va a tener una gran repercusión en los próximos años.

Consola de R en línea


R-fiddle

Consola de R interactiva desde tu explorador, sencilla y útil.

r-fiddle

Codingground

Consola de R interactiva desde tu explorador con mayores opciones, permite ingresar al terminal del servidor.

Codingground

DataJoy y R on cloud ya no están en funcionamiento.

Estas 2 herramientas dejaron de estar en funcionamiento a inicios de 2017.

Jupyter Notebook

Aplicación web de código abierto que permite crear y compartir documentos que contienen código en vivo, ecuaciones, visualizaciones y texto explicativo. Los usos incluyen: limpieza y transformación de datos, simulación numérica, modelado estadístico, aprendizaje automático y mucho más. Además, permite integración R, Python, Julia, Haskell, Ruby entre otros.

jupyter

R en la nube para aprendizaje

CodeSchool

Plataforma de aprendizaje de varios lenguajes de programación y herramientas para ciencia de datos. Code School enseña tecnologías web con lecciones de video, desafíos de codificación y screencasts. Su lema es aprender haciendo.

Buena opción si eres nuevo en R. El curso tiene 7 niveles en los cuales se muestra el manejo de la consola, expresiones regulares, variables, funciones, vectores, matrices, dataframes, etc.

CodeSchool - Try R

Datacamp

Plataforma de aprendizaje de varios lenguajes de programación y herramientas para ciencia de datos. Code School enseña tecnologías web con lecciones de video, desafíos de codificación y screencasts. Ideal para aprender haciendo.

DataCamp - Introduction to R

swirl

Swirl es un paquete creado para enseñar el lenguaje de programación R, pero desde tu computador, en sí no debería estar en esta publicación sobre R en la nube, pero dado que está muy ligado a los objetivos de Datacamp y Codeschool lo añadimos. Aprende R, en R.

swirl

Nota:

  • Si quieres convertirte en científico de datos y ser un experto en Clooud Computing no puedes no pasar por:


En futuras publicaciones abordaremos una extensión a estas herramientas con Cloud Computing de pago como Azure, Google Platform, AWS y gratuitas como 9cloud.

¿Nuevo en R o no conoces todo su potencial? Esto es para ti

¿Qué es R?

Si este es tu primer acercamiento a R, es muy probable que te encuentres analizando las ventajas y utilidades de R sobre otro software estadístico; como veremos más adelante R es mucho más que eso.

A través de R Users Group - Ecuador te invitamos a que explores este software poderoso, que puede ser aplicado ampliamente en el procesamiento, análisis de datos y visualización de resultados.

Empecemos señalando que R es un lenguaje de programación interpretado, de distribución libre, bajo Licencia GNU, y se mantiene en un ambiente para el cómputo estadístico y gráfico. Este software corre en distintas plataformas Linux, Windows, MacOS, e incluso en PlayStation 3. El término ambiente pretende caracterizarlo como un sistema totalmente planificado y coherente, en lugar de una acumulación gradual de herramientas muy específicas y poco flexibles, como se observa generalmente en software de análisis de datos.

Como lo explica John Chambers (Chambers and Hastie [1991]) creador y principal diseñador del lenguaje de programación S (lenguaje progenitor de R)

  • “Buscamos que los usuarios puedan iniciar en un entorno interactivo, en el que no se vean, conscientemente, a ellos mismos como programadores. Conforme sus necesidades sean más claras y su complejidad se incremente, deberían gradualmente poder profundizar en la programación, es cuando los aspectos del lenguaje y el sistema se vuelven más importantes.”

Por esta razón, en lugar de pensar en R como un software estadístico, es preferible verlo como un ambiente en el que se aplican técnicas estadísticas.

Fortalezas

Una de sus grandes fortalezas es que puede ser ampliado mediante paquetes que extienden sus funcionalidades. Actualmente hay más de 11000 paquetes publicados con licencias libres y disponibles en el repositorio general (CRAN), y alrededor de 4000 paquetes destinados al análisis de genomas (Bioconductor), además de paquetes presentes en github con extensiones específicas a nuevas áreas como bioinformática, bioestadística, geoestadística, modelos gráficos, etc.

R es un lenguaje de programación que está en constante evolución y del que se dispone de una amplia documentación, la comunidad en torno a R es muy activa por lo que es sencillo encontrar soluciones rápidamente a los problemas que los usuarios se puedan encontrar.

Aplicaciones


R funciona con cualquier tipo de archivo, es muy flexible, puede trabajar con datos procedentes de todo tipo de archivos: txt, csv, prm, JSON, xls, xlsx, dta, sav, mtp, png, jpeg, mp3, mp4, etc., etc., si, así es, imágenes, audio, video, etc., etc., puedes analizar imágenes, sonidos, videos, etc., etc.

Permite realizar análisis de estadística descriptiva, inferencial, paramétrica, no paramétrica, Bayesiana, univariante, multivariante, funcional, etc.

Permite comprimir y organizar la información en sus formatos .rda o .Rdata.

Permite integración con bases de datos relacionales Postgres, MySql, Oracle, etc., etc. y bases de datos no relacionales CouchDB, MongoDB, etc., etc.

Permite integración con SPSS Modeler, Tableau, Qlik Sense, ArcGIS, SAP, SAS, etc., etc.

La escalabilidad es un elemento clave, así que también permite integración con Hadoop, Spark, Elasticsearch, Kibana, es decir BIGDATA.

Permite el desarrollo de publicaciones, libros, aplicaciones, dashboards y presentaciones con shiny, shinydashboard, flexdashboard, slidify, rpresenter, markdown, bookdown, etc., etc.

Permite su uso con varios IDES como RStudio, RStudio Server, Microsoft R Server, VIM, Eclipse, Emacs Speaks Statistics.

Permite webscraping e integración con redes sociales.

Permite realizar análisis en tiempo real.

Obviamente puedes utilizar servicios soap, rest, etc., etc. y generar tareas automáticas o desarrollar aplicaciones con cloud computing con AWS, AZURE, Google Platform o usar tu propio servidor.

Y bueno, se nos deben escapar muchas opciones, pero esperamos que con este resumen muy breve se genere una mayor curiosidad en tí y te sumes a la comunidad de usuarios de R.

Si estas interesado en aplicar al menos uno de los temas señalados, en futuras publicaciones y capacitaciones los abordaremos.

Pequeña muestra de Shiny

¿El post R y markdown fue realmente básico?

¿Quieres algo dinámico?

Shinyapp básica

  • En futuras publicaciones abordaremos el desarrollo de dashboards y aplicaciones en shiny básicas y avanzadas.

Web oficial

R Users Group - Ecuador presenta su web oficial.

En esta web se registran todas las actividades de la comunidad R Users Group - Ecuador.

A su vez servirá como blog y repositorio para compartir investigaciones y aplicaciones de las mismas.

Nota:

  • Si te interesa publicar contenido, favor contáctanos a info@rusersgroup.com.
  • Únete a la comunidad de usuarios de R en Ecuador.
  • Comparte esta web con tu red.

R Users Group - Ecuador

R y Markdown - básico

Documentos Markdown generados con R

Este es un ejemplo básico del uso de R y Markdown para generar doumentos HTML, Word y PDF.

Código R

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Plot

par(mfrow=c(1,2))
plot(pressure)
boxplot(pressure)

Código para reproducir el ejemplo:

R_markdown_1.Rmd

Nota:

  • Debes usar el paquete markdown y guardar el código en formato .Rmd.
  • Entonces podrás ver estas opciones en Rstudio:

Curso Tratamiento, Visualización y Modelamiento Estadístico con R - Universidad Cenral del Ecuador

Tratamiento, Visualización y Modelamiento Estadístico con R

Curso de R: 100% práctico

Certificado avalado por la Facultad de Ciencias Económicas de la Universidad Central del Ecuador y el R Users Group - Ecuador + Refrigerio.

Instructor:

Miguel A. Flores Sánchez, PhD en Estadística e Investigación de Operaciones, docente investigador del Departamento de Matemática de la EPN, capacitador de la Sociedad Ecuatoriana de Estadística en el lenguaje de programación R. Además es el fundador de la comunidad R Users Group - Ecuador.

Para mayor información:

Comuníquese con Dayana Tipán o Bladimir Echeverría (Aso FCE):

https://www.facebook.com/dayanna.tipan

https://www.facebook.com/bladimir.echeverria

Te invitamos a ser parte del primer Grupo de Usuarios de R en Ecuador.

Compartiremos conocimientos entre científicos de datos de Ecuador, que te ayudarán a mejorar profesionalmente.

En nuestro blog podrás encontrar guías y proyectos muy útiles e innovadores.

Síguenos en LinkedIn y twitter.

LinkedIn: https://www.linkedin.com/groups/4308508

Twitter: https://twitter.com/Rgrupoec

Meeting de Ciencia y Arte - conCienciArte

conCienciArte

“La creatividad es la inteligencia divirtiéndose” A. Einstein

Cuando ciencia y arte se juntan.

La SEE y R Users Group - Ecuador te invitan a este meet-up con exponentes que hacen de la estadística un arte y expresiones artísticas diversas, un espacio para la creatividad y el networking.

CIENCIA

Roberto Castillo, Subdirector Ejecutivo del INEC

Rubén Bonilla, Gerente General de Blue Focus

Miguel Flores, fundador del R Users Group - Ecuador

ARTE

Juan Miranda, poeta

Lilia Quituisaca-Samaniego, poeta

Andrés Barzola, bailarín

El arte de hacer ciencia y la ciencia de hacer arte.